重複の可能性:
配列インデックスの代わりに反復子を使用するのはなぜですか?
私の人生では、なぜそれらが冗長でないのか理解できないからです。
vector<string>::iterator iter1
vector<string>::const_iterator iter2
多分彼らは速いですか?
重複の可能性:
配列インデックスの代わりに反復子を使用するのはなぜですか?
私の人生では、なぜそれらが冗長でないのか理解できないからです。
vector<string>::iterator iter1
vector<string>::const_iterator iter2
多分彼らは速いですか?
イテレータは高速化を目的としているのではなく、高速化を目的としており、実際よりもはるかに汎用的です。array[i]
リンクされたリストではなく、配列に対してのみ有効です。
イテレータを使用すると、コンテナに依存しないアルゴリズムを開発できます。このように、適切な反復子の要件を満たしている限り、のようなものは、またはstd::sort
であるかどうかを実際に気にする必要はありません。vector
your_datastructure_here
list
、vector
、または裸の配列で最大値を見つけることを検討してください。
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());
ベクターを介した「ランダムアクセス」の単純なケースでは?いいえ。
実際、ベクトル反復子はおそらく配列アクセスに関して定義されており、正確に高速です。
得られるのは、ジェネリック プログラミングでそれらを使用する能力です。常にベクターを使用しているわけではなく、すべてのコンテナーがランダム アクセスをサポートしているわけではありません。
一貫性のためだけでなく、そのような一貫性が提供するテンプレート メタプログラミングを活用する機能のために、反復子を使用します。
そして、少なくとも、それらは安全で役立つ抽象化です。
それらは、array [i]がはるかに遅い(つまりリスト)または不可能でさえある(レコードセット)他のコレクションに一般化されます。
また、STLアルゴリズムはそれらを使用します。STLアルゴリズムは、反復可能なコレクションで機能するように設計されています-なぜベクトルを除外するのですか?
2つのイテレータ(一方const
とそうでないもの)の存在は、const参照がC++で機能する方法によって動機付けられています。あなたが持っているのがconst
ベクトルへの参照だけであるなら、なぜあなたは中のものを変えることができるべきですか?したがってconst_iterator
。レギュラーiterator
は、要素への書き込み可能な参照を返します。
イテレータは一般的な概念です。それらはあらゆる種類のコンテナで動作し、同様のインターフェースを備えています。
のように配列要素に直接アクセスするarr_int[i]
ことは、ポインタ演算に直接変換されるため、間違いなく高速です。