10

ほとんどのコンテナーでは、iterator型はコンテナー内の値への読み取り/書き込みアクセスを提供し、const_iterator型は読み取り専用アクセスを提供します。ただし、std::set<T>の場合、セット内の値を変更すると (潜在的に) コンテナの不変条件が壊れるため、反復子型は読み取り/書き込みアクセスを提供できません。したがって、 ではstd::set<T>、 と の両方が読み取り専用アクセスiteratorを提供します。const_iterator

これは私の質問につながります: でできることと でできることの間に違いはありますstd::set<T>::iteratorstd::set<T>::const_iterator?

C++11 では、コンテナー ( など) の操作メソッドは引数eraseを取ることができることに注意してください。const_iterator

4

2 に答える 2

8

いいえ、それらの間に大きな機能上の違いはありません。もちろん、以前は C++03 に戻っていましたが、 が返されませset<T>::iteratorんでしたconst T&。しかし、いったん変更すると、同じことを行う 2 つの異なる種類の反復子に行き詰まりました。

実際、標準は、それらが同一の機能を持っていることを非常に明確にしています (同じタイプにすることができますが、そうである必要はありません)。23.2.4、p。6:

iterator連想コンテナの は、双方向イテレータ カテゴリです。値の型がキーの型と同じである連想コンテナーの場合、 と の両方iteratorconst_iterator定数反復子です。iteratorとが同型かどうかは不明const_iterator。[注: iteratorこの場合、とはconst_iterator同じセマンティクスを持ち、 anditeratorは に変換可能const_iteratorです。ユーザーはconst_iterator、関数パラメーター リストで常に を使用することで、1 つの定義規則に違反することを回避できます。—<em>終わりのメモ]

于 2012-09-05T14:10:27.507 に答える
1

私たち (Err I) が大規模なアプリを VC 10.0 に移植したとき、このルールが有効になりました。非 const メソッドを呼び出してイテレータを操作していたあらゆる種類の古いコードが壊れました。

これが、私が見つけた最大の違いにつながります。const イテレーターでのみ const メソッドを呼び出すことができます。一方、古い標準では、const 以外のメソッドを無意識に呼び出して、セットを台無しにすることができました。場合によっては、一部のセットをマップに置き換えることになり、コンテナに格納されるアイテムにコードを絶対に変更する必要があることがわかりました。

それが役立つことを願っています。

于 2012-09-06T01:11:25.880 に答える