std :: set iterator自动为const

Val*_*ond 16 c++ const std set

可能重复:
C++ STL集更新很繁琐:我无法更改元素

我已经解决了问题并更改了名称,因此为了简单起见.

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

简化代码:

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

和错误:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &'
Run Code Online (Sandbox Code Playgroud)

(我删除了部分错误消息"MVB :: Run ::"以清除它.)

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

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

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

use*_*604 19

我确定你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);
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以做到这一点,但这是不好的做法. (3认同)

Oli*_*rth 13

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