STL内の実装に関するこれら2つの違いは何ですか。パフォーマンスに関する違いは何ですか? 「読み取り専用」でベクトルをトラバースするとき、const_iterator
を好むでしょうか?
ありがとうございました。
パフォーマンスの違いはありません。
const_iterator
は、(const T*
ポインターのように)const値を指す反復子です。これを逆参照すると、定数値(const T&
)への参照が返され、参照値の変更が防止されます。 const
- correctness が強制されます。
コンテナへのconst参照がある場合、const_iterator
のみを取得できます。
Edited:「const_iterator
は定数ポインターを返します」と述べましたが、正確ではありません。指摘してくれたBrandonに感謝します。
Edit:COWオブジェクトの場合、非定数反復子を取得(または参照解除)すると、コピーがトリガーされる可能性があります。 (一部の廃止され、現在は許可されていないstd::string
の実装はCOWを使用します。)
パフォーマンスに関しては違いはありません。 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を使用してコンテンツを変更しようとすると、読み取り専用のためエラーが発生します。
リストがあり、次のステートメントがある場合
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