web-dev-qa-db-ja.com

const_iteratorとiteratorの違いは何ですか?

STL内の実装に関するこれら2つの違いは何ですか。パフォーマンスに関する違いは何ですか? 「読み取り専用」でベクトルをトラバースするとき、const_iteratorを好むでしょうか?

ありがとうございました。

119
user658266

パフォーマンスの違いはありません。

const_iteratorは、(const T*ポインターのように)const値を指す反復子です。これを逆参照すると、定数値(const T&)への参照が返され、参照値の変更が防止されます。 const- correctness が強制されます。

コンテナへのconst参照がある場合、const_iteratorのみを取得できます。

Edited:const_iteratorは定数ポインターを返します」と述べましたが、正確ではありません。指摘してくれたBrandonに感謝します。

Edit:COWオブジェクトの場合、非定数反復子を取得(または参照解除)すると、コピーがトリガーされる可能性があります。 (一部の廃止され、現在は許可されていないstd::stringの実装はCOWを使用します。)

118
ysdx

パフォーマンスに関しては違いはありません。 const_iterator over iteratorを持つ唯一の目的は、それぞれのイテレータが実行されるコンテナのアクセス可能性を管理することです。例でより明確に理解できます。

std::vector<int> integers{ 3, 4, 56, 6, 778 };

コンテナのメンバーを読み書きする場合、イテレーターを使用します:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
       {*it = 4;  std::cout << *it << std::endl; }

コンテナintegersのメンバーのみを読み取る場合は、const_iteratorを使用します。const_iteratorは、コンテナーのメンバーの書き込みまたは変更を許可しません。

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

注:2番目のケースで* itを使用してコンテンツを変更しようとすると、読み取り専用のためエラーが発生します。

37
AbhimanyuAryan

リストがあり、次のステートメントがある場合

list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();

リスト内の要素の内容は、「cit」ではなく「it」を使用して変更できます。つまり、「cit」を使用して、要素を更新するのではなく内容を読み取ることができます。

*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error
6
Seenivasan