2

重複の可能性:
配列インデックスの代わりに反復子を使用するのはなぜですか?

私の人生では、なぜそれらが冗長でないのか理解できないからです。

vector<string>::iterator iter1
vector<string>::const_iterator iter2

多分彼らは速いですか?

4

5 に答える 5

7

イテレータは高速化を目的としているのではなく、高速化を目的としており、実際よりもはるかに汎用的です。array[i]リンクされたリストではなく、配列に対してのみ有効です。

于 2011-05-31T15:11:17.577 に答える
6

イテレータを使用すると、コンテナに依存しないアルゴリズムを開発できます。このように、適切な反復子の要件を満たしている限り、のようなものは、またはstd::sortであるかどうかを実際に気にする必要はありません。vectoryour_datastructure_here

listvector、または裸の配列で最大値を見つけることを検討してください。

int A[...];         // ...some array
std::list<int> L;   // ...some list
std::vector<int> V; // ...some vector

int* maxA                       = std::max_element(A, A + 10);
std::list<int>::iterator maxL   = std::max_element(L.begin(), L.end());
std::vector<int>::iterator maxV = std::max_element(V.begin(), V.end());
于 2011-05-31T15:09:57.437 に答える
3

ベクターを介した「ランダムアクセス」の単純なケースでは?いいえ。

実際、ベクトル反復子はおそらく配列アクセスに関して定義されており、正確に高速です。

得られるのは、ジェネリック プログラミングでそれらを使用する能力です。常にベクターを使用しているわけではなく、すべてのコンテナーがランダム アクセスをサポートしているわけではありません。

一貫性のためだけでなく、そのような一貫性が提供するテンプレート メタプログラミングを活用する機能のために、反復子を使用します。

そして、少なくとも、それらは安全で役立つ抽象化です。

于 2011-05-31T15:11:03.507 に答える
1

それらは、array [i]がはるかに遅い(つまりリスト)または不可能でさえある(レコードセット)他のコレクションに一般化されます。

また、STLアルゴリズムはそれらを使用します。STLアルゴリズムは、反復可能なコレクションで機能するように設計されています-なぜベクトルを除外するのですか?

2つのイテレータ(一方constとそうでないもの)の存在は、const参照がC++で機能する方法によって動機付けられています。あなたが持っているのがconstベクトルへの参照だけであるなら、なぜあなたは中のものを変えることができるべきですか?したがってconst_iterator。レギュラーiteratorは、要素への書き込み可能な参照を返します。

于 2011-05-31T15:12:50.273 に答える
-1

イテレータは一般的な概念です。それらはあらゆる種類のコンテナで動作し、同様のインターフェースを備えています。

のように配列要素に直接アクセスするarr_int[i]ことは、ポインタ演算に直接変換されるため、間違いなく高速です。

于 2011-05-31T15:12:40.697 に答える