const_iterator
aと anの違いは何ですかiterator
? どこでどちらを使いますか?
7 に答える
const_iterator
s では、それらが指す値を変更することはできませんが、通常iterator
の s では変更できます。
C++ のすべてのものと同様に、通常のイテレータを使用する正当な理由 (つまり、ポイント先の値を変更しconst
ないという事実を利用したい) がない限り、常にprefer を使用してください。const
それらはほとんど一目瞭然です。iterator が T 型の要素を指す場合、const_iterator は「const T」型の要素を指します。
基本的にはポインタ型と同等です:
T* // A non-const iterator to a non-const element. Corresponds to std::vector<T>::iterator
T* const // A const iterator to a non-const element. Corresponds to const std::vector<T>::iterator
const T* // A non-const iterator to a const element. Corresponds to std::vector<T>::const_iterator
const 反復子は常に同じ要素を指すため、反復子自体が const です。ただし、それが指す要素は const である必要はないため、それが指す要素は変更できます。const_iterator は、const 要素を指す反復子であるため、反復子自体は更新できますが (たとえば、インクリメントまたはデクリメント)、それが指す要素を変更することはできません。
残念ながら、STLコンテナーの多くのメソッドは、パラメーターとしてconst_iteratorsではなくイテレーターを使用します。したがって、const_iteratorがある場合、「このイテレータが指す要素の前に要素を挿入する」とは言えません(私の意見では、そのようなことは概念的にconst違反ではありません)。とにかくそれを実行したい場合は、std :: Advance()またはboost :: next()を使用して非定数イテレータに変換する必要があります。例えば。boost :: next(container.begin()、std :: distance(container.begin()、the_const_iterator_we_want_to_unconst))。コンテナがstd::listの場合、その呼び出しの実行時間はO(n)になります。
したがって、「論理的」な場所にconstを追加するという普遍的なルールは、STLコンテナーに関してはあまり普遍的ではありません。
ただし、ブーストコンテナはconst_iteratorsを使用します(例:boost :: unordered_map :: Erase())。したがって、ブーストコンテナを使用すると、「コンストアグレッシブ」になる可能性があります。ちなみに、STLコンテナが修正されるかどうか、いつ修正されるかは誰か知っていますか?
できる限り const_iteratorを使用し、他に選択肢がない場合はiteratorを使用してください。
わかりました最初に、定数イテレータを使用せずに非常に単純な例で説明しましょう。ランダムな整数コレクション「randomData」のコレクションがあると考えてください。
for(vector<int>::iterator i = randomData.begin() ; i != randomData.end() ; ++i)*i = 0;
for(vector<int>::const_iterator i = randomData.begin() ; i!= randomData.end() ; ++i)cout << *i;
コレクション内のデータの書き込み/編集では通常のイテレータが使用されますが、読み取り目的では定数イテレータが使用されています。最初の for ループで定数反復子を使用しようとすると、エラーが発生します。経験則として、定数反復子を使用して collection 内のデータを読み取ります。
(他の人が言ったように) const_iterator では、それが指す要素を変更することはできません。これは、const クラス メソッド内で役立ちます。また、自分の意思を表明することもできます。