2013-04-30 7 views
7

C++リファレンスによると、set :: insertは、イテレータが新しく挿入された要素を指しているか、存在する場合は既存の要素を指しているところでpairを返すことになっています。この簡単な例が示すようにstd :: set :: insert()からのイテレータを返すのはconstですか?

は、しかし、私は、イテレータに割り当てる問題を抱えている:私はG ++とクランとどちらの作品試した

int main() { 
    set<int> set; 
    *set.insert(5).first = 5; 
    return 0; 
} 

set.cc:7:24: error: read-only variable is not assignable 
    *set.insert(5).first = 5; 
    ~~~~~~~~~~~~~~~~~~~~^

私はどちらか、これを示すことになる型シグネチャでイテレータがconstオブジェクトに欽慕する必要があることを示しドキュメントに何か、そして何を見つけることができません。なぜこれがうまくいかないのか誰かが私に助けられますか?

答えて

13

std::setの場合、対応するiteratorconst_iteratorの両方のタイプは、固定双方向イテレータです。これは、std::setが注文されたためです。イテレータを使用してセットの要素を変更する場合は、その順序を破ることになります。

std::setの要素が{1, 4, 8}であるとします。 *set.insert(5).first = 10;(許可されている場合)の場合は、最初に5を挿入して{1, 4, 5, 8}を取得し、挿入された要素を10に設定して{1, 4, 10, 8}に設定します。順序不変式は現在破損しています。

5insert(5)と挿入しているので、イテレータを参照解除して5を割り当てる理由はありません。

+0

Duh。私はこれを考えていたはずです。ありがとう。私の実際の例では、intではありませんでした、私はいくつかの状態を変更したい、より複雑なオブジェクトでした。 – drwowe

4

セットのメンバーを変更することはできません。それは注文したコンテナです。そのイテレータは代入不可能です。

3

C++ 11では、反復子はconst型を参照して設定します(set reference参照)。それについて考えると、セットがその要素を順序付けして格納し、特定の要素を単に変更するだけで、順序制約に違反する可能性が高くなります。