私は、STLコンテナのセットとマップが厳密な弱い順序で要素を提供すると考えました。しかし、逆参照によって要素の値を見つけて変更することでイテレータを取得した場合、順序を復元することはできませんが、23.1.2.2および23.3.3.2に違反します。ここでは、コードセットの厳密な弱い順序を失う
int nv = 3;
set<int> s = set<int>();
s.insert(5);
s.insert(10);
s.insert(20);
s.insert(30);
for(set<int>::const_iterator cit = s.begin(); cit != s.end(); ++cit)
cout<<*cit<<" ";
cout <<endl;
set<int>::iterator it = s.find(10);
*it = nv;
for(set<int>::const_iterator cit = s.begin(); cit != s.end(); ++cit)
cout<<*cit<<" ";
cout <<endl;
s.insert(40);
for(set<int>::const_iterator cit = s.begin(); cit != s.end(); ++cit)
cout<<*cit<<" ";
cout <<endl;
が生成されます。
5 10 20 30
5 3 20 30
5 3 20 30 40
それはSTLの私のバージョン(MS VS 2008)のバグですか?または私は間違っていますか?
いいえ、上記のコードはコンパイル、リンク、実行されます – flashnik
コンパイラまたはライブラリが壊れている場合のみコンパイルできます。例えば、現在のドラフト23.2.4/6: " の値の型がキーの型と同じである連想型のコンテナの場合、iteratorとconst_iteratorは両方とも定数イテレータです" –
@flashnik:これはすべきですSTLまたはコンパイラの実装のいずれかでバグがあります。私の意見では、これをコンパイルすることはできません。 –