3

イテレータを使用する必要があるのはなぜですか?

たとえば、次のようなコードがあるとします。

for (int i = 0; i < vec.size(); i++)
   cout << vec[i];

書くメリットはなんだろう

for (vector<int>::iterator it != vec.begin(); it != n.end(); ++it)
   cout << *it;

また、最初の例ではandがより一般的で、2 番目の例ではi < vec.size()andがより一般的であるのはなぜですか? それをインクリメントする方法と、常に等号を使用しない理由の違いは何ですか?i++it != begin()++it

イテレータが C++11 の範囲ベースの for ループや一部の STD アルゴリズムで役立つことは理解していますが、通常のコードではより冗長になるため、なぜそれを行う必要があるのでしょうか?

4

4 に答える 4

2

すべてのコンテナがランダム アクセスできるわけではないため、インデックスを検索できるため、インターフェイス イテレータを正規化するにはかなり便利です。を検討してくださいstd::list[]オペレーターによるランダムアクセスはサポートしていません。

これを考慮して、さまざまな種類のコンテナーで機能するために、std::copy などの多くの STL 関数はイテレーターを使用します。

于 2013-02-26T02:50:54.043 に答える
1

このコードがあるとしましょう:

typedef std::vector<std::string> strings;

strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}

そして後で、なんらかの理由で std::list に切り替えることにしました。したがって、typedef と code を置き換えるだけです。

typedef std::list<std::string> strings;

strings strs;
for( strings::const_iterator it = strs.begin(); it != strs.end(); ++it ) {
}

以前のように動作します。ただし、インデックス変数を含むコードは失敗します。テンプレート コードを記述する必要がある場合を想像してみてください。

于 2013-02-26T02:53:59.773 に答える
1

ポイントは、イテレータを使用すると、イテレータをサポートするすべてのものを一般的な方法で反復できるということです。

より冗長であることに関しては、余分な冗長性はひどいものではありません ( autoC++ 11 範囲ベースの for ループを使用または使用して、例をわずかに改善することができます) が、それは実際には文体の問題です。

于 2013-02-26T02:51:34.710 に答える
0

tl;dr は、さまざまな種類のオブジェクトの一般的なケースでイテレータがより適切に機能することです (たとえば、size() メソッドが遅い場合)。

詳細については、次を参照してください。

配列インデックスの代わりに反復子を使用する理由

イテレータ..なぜそれらを使用するのですか?

于 2013-02-26T02:55:55.470 に答える