5

ISO 14882 2003(別名C ++の聖なる標準)によると、パラメータとして(ではなく)std::set<K, C, A>::eraseを使用しているようです。iteratorconst_iterator

23.3.3から[2]

void erase(iterator position);

また、VS2008に付属しているSTLの実装では、const_iterator別のコンパイラでコードをコンパイルしようとすると、消去に時間がかかり、不快な驚きが生じたことも注目に値します。さて、私のバージョンはをとるので、(それが自明ではなかったかのように)const_iterator消去を実装することが可能です。const_iterator

標準化委員会は、を取得するために消去を必要とするいくつかの実装(または手元にある既存の実装)を念頭に置いていたと思いますiterator

  • これが事実であることに同意する場合、削除される予定の要素を変更する必要がある実装について説明してくださいset::erase(私はできません)。
  • 同意できない場合は、なぜ彼らがこの決定を思い付くのか教えてください。つまり、要素を消去することは、ポインタを再配置することです。

編集

イテレータの場合でも、セット内の要素を変更できないことに気づきました。しかし、疑問はまだ残っています-特に、ある意味で同等である場合は、const_iteratorを使用しないのはなぜですか?

4

3 に答える 3

4

これは欠陥でした。C ++ 11以降、次set<K,C,A>::eraseのようになりますconst_iterator

iterator erase(const_iterator position);

2007年のこのペーパーでは、そのエラーを説明し、それを回避するための実装を示しました。この論文が規格変更の理由かどうかはわかりませんが、おそらくそれは良い推測です。

于 2011-07-13T20:26:18.843 に答える
0

が必要な理由を実際に考えることはできないiteratorので、私は任意に傾いています。構造を変更するopは、iterator以前に使用したものiteratorが後で機能しない可能性があることをユーザーに通知するために必要です。

  • eraseイテレータを無効にします。
  • insert(iter, val)次の値を変更します。
于 2011-07-13T20:13:11.457 に答える
-1

私の唯一の推測は、insertupper_boundlower_bound、およびfindが(const iteratorではなく)イテレータを返しているためです。他の説明は見当たりません。

于 2011-07-13T20:00:42.320 に答える