2

iterator オブジェクトのアイデアは、C++ コンテナー クラスに同様に適用できるということだと思いました。ただし、リストオブジェクトを反復しようとすると、使用してみました

for(list<int>::iterator it = obj.begin(); it < obj.end(); it++){
    // some code
}

そして、エラーが発生しました。なぜこれが機能しないのですか?なぜそれがうまくいくのvector::iteratorですか?リストの実装が双方向のリンクされたリストであるためだけですか? イテレータ オブジェクトは、コンテナー間を移動するという概念を抽象化するので、ベクターでもリストでも同じ操作が可能になると思いました。

説明をいただければ幸いです。

4

4 に答える 4

7

std::vectorイテレータとは異なり、std::listイテレータはランダム アクセスではなく、シーケンシャルであるため、これは機能しません。それらで使用する必要があり!=ます:

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++)

<一般に、すべてのイテレータでとの比較が許可されている場合でも、範囲全体をカバーする場合は、すべてのイテレータで「等しくない」を使用することをお勧めします>最強の事後条件!=が得られるため、通常のforループでも使用することを支持する議論もあります。

于 2013-02-21T15:48:16.257 に答える
1

!=リストイテレータはすべてのメモリ全体にランダムな順序で散在しているため、比較する必要があります。

使用する:for(list<int>::iterator it = obj.begin(); it != obj.end(); it++)

于 2013-02-21T15:49:15.693 に答える
0

これは、 がランダム アクセスlistイテレータをサポートしておらず、フォワードイテレータのみをサポートしているためです。したがって、は a の反復子に対して定義されていません。不等式の比較に使用する必要があります。operator <listoperator !=

于 2013-02-21T15:49:31.033 に答える
0

順序比較演算子 ( など<) を含む演算子演算は、ランダム アクセス反復子に対してのみ定義されます。コードを use に変更すると、動作します (が である!=と仮定):objlist<int>

for(list<int>::iterator it = obj.begin(); it != obj.end(); it++){
    // some code
}
于 2013-02-21T15:49:56.963 に答える