可能重复:
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”,那么一切都运行良好但是我无法更改值......
这是正常的行为,我必须删除数据,更改值并将其重新放回去吗?
我觉得这与集合的排序有关,但我不会触及用于排序的变量。
答案 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)
是的,这是预料之中的。如果您能够编辑集合中已有的对象,则应用的排序顺序可能不再适用,从而导致未定义的行为。