STL内での実装に関して、これら2つの違いは何ですか。パフォーマンスの違いは何ですか?「読み取り専用」でベクトルをトラバースするときは、私たちが好むconst_iterator
と思いますよね?
ありがとうございました。
STL内での実装に関して、これら2つの違いは何ですか。パフォーマンスの違いは何ですか?「読み取り専用」でベクトルをトラバースするときは、私たちが好むconst_iterator
と思いますよね?
ありがとうございました。
パフォーマンスの違いはありません。
Aconst_iterator
は、const値(const T*
ポインターなど)を指すイテレーターです。間接参照すると、定数値(const T&
)への参照が返され、参照値の変更が防止されます。これにより、const
-correctnessが適用されます。
コンテナへのconst参照がある場合、取得できるのは。のみですconst_iterator
。
編集:const_iterator
ブランドンが指摘してくれたおかげで、正確ではない「リターン定数ポインター」について言及しました。
編集: COWオブジェクトの場合、非定数イテレーターを取得する(または逆参照する)と、おそらくコピーがトリガーされます。(一部の廃止され、現在はstd::string
使用が許可されていないCOWの実装。)
パフォーマンスに関しては違いはありません。const_iterator
オーバーする唯一の目的は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を使用することをお勧めします。
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