2017-04-26 6 views
1

私はstd :: vectorに10000個の非constオブジェクトを持っています。私はそれらをstd :: setに入れたいと思います。<algorithm>からstd :: setの関数が非constオブジェクトをconstに変更する理由は?

set<Object,bool(*)(Object, Object)> s([](Object a, Object b){ 
            return a.getId() < b.getId()}); 

このオブジェクトでいくつかの変数を変更したいと思います。

for_each(s.begin(), s.end(), [=](Object& a){ 
    a.setId(new_id); 
    }); 

なぜ私がfrom関数を使用していると、オブジェクトが "const qualifier"を失うというエラーが表示されます。しかし、ベクトルではすべて正常です。私はいくつかの考えを持っています: 1)for_eachには、自動的にconst_iteratorが使われます。 2)setは非constをconstにキャストしますが、問題がなければiteratorのオブジェクトを取得して変更できるので間違っていると思います。

誰かがあなたがstd::set内の要素を変更することはできませんので、ここで

答えて

1

を何が起こるか、私を説明することができます。このセットには、あなたが何を変えたかを知る方法がなく、それを無効にします。可能であれば、厳密に弱い順序不変を破る可能性があり、結果として未定義の動作が発生します。

要素を変更する場合は、要素を消去して新しい要素を挿入する必要があります。私は力の一定性は、要素を変更しようとするのを防ぐことだと思います。

関連する問題