145

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

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

4

3 に答える 3

141

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

Aconst_iteratorは、const値(const T*ポインターなど)を指すイテレーターです。間接参照すると、定数値(const T&)への参照が返され、参照値の変更が防止されます。これにより、const-correctnessが適用されます。

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

編集:const_iteratorブランドンが指摘してくれたおかげで、正確ではない「リターン定数ポインター」について言及しました。

編集: COWオブジェクトの場合、非定数イテレーターを取得する(または逆参照する)と、おそらくコピーがトリガーされます。(一部の廃止され、現在はstd::string使用が許可されていないCOWの実装。)

于 2011-03-18T00:52:11.487 に答える
49

パフォーマンスに関しては違いはありません。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を使用してコンテンツを変更しようとすると、読み取り専用であるためエラーが発生します。

于 2015-01-26T18:47:13.827 に答える
10

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

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
于 2017-03-01T15:20:22.473 に答える