web-dev-qa-db-ja.com

C ++ STL:ポインター付きのリスト-イテレーターはアクセスできませんか?

「オブジェクト」オブジェクトのポインタを保持するSTLリストに苦労しています。

私は宣言しました:

list<Object*> objectlist;

および挿入:

this->objectlist.Push_back(new Object(address,value,profit));

地図などのように繰り返してみました。

list<Object*>::iterator iter;

iter = this->objectlist.begin();

while(iter != this->objectlist.end())
{
    iter->print();
}

Print()はクラスObjectのパブリックメソッドです。

ここで何が問題なのですか?

リスト内のオブジェクトにイテレータ経由でアクセスできませんか?

15
Stefan

(*iter)->print();が必要です

ポインタへのイテレータがあるため、最初にイテレータを逆参照する必要があり(これにより、Object*が取得されます)、次に矢印がObject *を逆参照し、呼び出しを印刷できるようにします。

30
RC.

イテレータをインクリメントしていません! whileループを次のようにforループに変更します。

for (list<Object*>::const_iterator iter = this->objectlist.begin(),
     end = this->objectlist.end();
     iter != end;
     ++iter)
{
    (*iter)->print();
}

(また、他の回答が指摘しているように、iterdereferencesポインタへ。)

7
Kerrek SB

* iterを使用してイテレータが指す値にアクセスできます

また、反復ごとにイテレータをインクリメントすることを忘れないでください。そうしないと、無限ループに陥ります。

このような:

iter = this->objectlist.begin();

while(iter != this->objectlist.end())
{
    (*iter)->print();
    iter++;
}
3
Juho

C++ 11の方法を試すことができます(可能な場合)。イテレータの間接参照は無料です:)

for (auto& iter: this->objectlist)
{
     iter->print();
}

また、print()がconst関数である場合は、使用する必要があります

for (const auto& iter: this->objectlist)
2
alanw

for-ループの代わりに、STLのfor_each()を使用する必要があります-単純なfor-ループよりも for_eachの利点 を参照してください。

構文

_#include <algorithm> // 'for_each()' is in there

std::for_each(InputIterator first, // Iterator start position
              InputIterator last,  // Iterator end position
              Function fn);        // Unary function - executed on all elements in range
_

_for_each_例

例はstd::for_each()ではなくfor( ... )のようになります。

_list<Object*> objectlist;

// insert some elements …

// Deletes all elements of 'objectlist'
std::for_each(objectlist.begin(), objectlist.end(), DeleteObj<Object*>());
_

単項関数

単項関数はテンプレートを使用して実装されるため、anyタイプで使用できます。 Tがポインタ型であることを確認してください!

_template<class T> class DeleteObj
{
public:
    bool operator()(T obj) const
    {
        delete obj;
        return true;
    }
};
_

ところで。これをテンプレートとして実装する必要はありません。そして:そのような実装の代わりにメンバー関数をバインドすることもできます!

ドキュメンテーション

1
ollo

次の方法を使用する必要があります。

(*iter)->print()
0
小武哥

イテレータはリスト内の要素を参照するため、タイプTのリストの場合、イテレータを逆参照すると、タイプTの値が生成されます。

あなたの場合、Tは実際にはポインタです-Object*。従って iter-> call(イテレータを逆参照する)はポインタを生成します。 actualaオブジェクトに到達するには、そのポインターを逆参照する必要があります。

使ってみてください

(*iter)->print()

代わりに。

0
Frerich Raabe