std :: set iterator自动为const

时间:2012-03-15 19:01:47

标签: c++ set const std

  

可能重复:
  C++ STL set update is tedious: I can't change an element in place

我已经提取了问题并更改了名称,因此为了简单起见。

基本上我实例化一个类,并将其存储在std :: set中,稍后我想要引用该类,以便检查其值并修改它们......

简化代码:

        MyClass tmpClass;
        std::set<MyClass > setMyClass;
        setMyClass.insert(tmpClass);
        std::set<MyClass >::iterator iter;
        iter=setMyClass.begin();
        MyClass &tmpClass2=*iter;

和错误:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &'

(我删除了部分错误消息“MVB :: Run ::”以清除它。)

如果我在最后一行代码中添加一个前面的“const”,那么一切都运行良好但是我无法更改值......

这是正常的行为,我必须删除数据,更改值并将其重新放回去吗?

我觉得这与集合的排序有关,但我不会触及用于排序的变量。

2 个答案:

答案 0 :(得分:18)

我确定你won't touch the variables that are used for the sorting你可以通过这样使用const_cast来解决这个问题:

    MyClass tmpClass;
    std::set<MyClass > setMyClass;
    setMyClass.insert(tmpClass);
    std::set<MyClass >::iterator iter;
    iter=setMyClass.begin();
    const MyClass &tmpClass2=*iter;

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2);

或者,您可以将要更改的类的成员声明为mutable.

答案 1 :(得分:14)

是的,这是预料之中的。如果您能够编辑集合中已有的对象,则应用的排序顺序可能不再适用,从而导致未定义的行为。