0

これは私のコードです:

for (list<moveStringTree>::iterator tempIterator=moveList.begin();tempIterator!=moveList.end(); ++tempIterator)
{
    moveStringTree *move = tempIterator;
}

しかし、それは私にエラーを与えます。キャスティングウェイがある場合、私はそれが好きではありません。時間がかかりすぎます。とにかく、リストをスローして、その中の各オブジェクトで何かをしたいと思っています。私に何ができる?foreach は役に立ちません。それだけがコピーを与えるからです。

4

4 に答える 4

3

イテレータはオブジェクトではありませんか?

です。C ++のオブジェクトは、値を保持するメモリ位置に相当します–それ以上でもそれ以下でもありません。ただし、これが残りの質問とどのように関連しているかはわかりません。

しかし、それは私にエラーを与えます。キャスティングウェイがあれば、私はそれが好きではありません。時間がかかりすぎます。

これが何を意味するのかわかりません。ただし、コピーを意味する場合に備えて、いいえ、おそらくそれほど時間はかかりません。しかし、そうである場合–心配しないでください。参照を使用します。

moveStringTree& move = *tempIterator;

foreachは役に立ちません。それだけがコピーを与えるからです。

ナンセンス。foreachは、手動で反復するのと同じことを行います。したがって、コピーで使用することもできます。

for (auto& o : moveList) {
    // Do something.
}
于 2012-08-25T20:39:33.623 に答える
2

試す:

moveStringTree *move = & (*tempIterator) ;

(括弧は厳密には必要ありません)

イテレータ自体はオブジェクトへのポインタではありませんが、*をオーバーロードして、参照するオブジェクトへの参照を返します。そこから、通常の&を使用してポインタを取得できます。

イテレータは->演算子もオーバーロードするため、通常はこれを行う必要がないことに注意してください。通常の->構文を使用してオブジェクトのメンバーにアクセスできます。

于 2012-08-25T20:36:54.090 に答える
2

イテレータをポインタのように使用できますが、実際にはポインタではありません。ただし、そこからポインターを取得するために実行できるダンスがあります。

moveStringTree *move = &*tempIterator;

*は反復子が参照する要素への参照に解決され、は&その要素のアドレスを返します。最終結果はポインタです。

もちろん、おそらくそれを行うべきではありません。これ:

tempIterator->doSomething();

うまく動作します。

于 2012-08-25T20:36:01.280 に答える
1

実際、から参照を得ることができますstd::for_eachmoveStringTree* move = &*tempIterator;正しいでしょう。ただし、より直接的には、問題のオブジェクトへのポインターであるtempIteratorのように単純に使用できます。

for(auto it=moveList.begin();it!=moveList.end(); ++it) {
    it->f(); // well formed if moveStringTree::f()
}
于 2012-08-25T20:36:16.433 に答える