std::set 迭代器自动 const

17
可能重复:
C++ STL set更新很繁琐:我无法原地更改元素 我实例化一个类并将其存储在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个回答

20

如果您确定不会触及用于排序的变量,则可以通过像这样使用const_cast来解决此问题:

如果您确定不会触及用于排序的变量,则可以通过使用 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


3
你可以这样做,但这是不好的做法。 - Oliver Charlesworth
1
@Oliver:如果你有异构查找并且想要更改非关键部分,那么拥有const迭代器会相当麻烦。我同意const_cast是一种不好的做法,但除了在整个地方使用mutable作为类成员或者使用erase/insert带来性能惩罚的类似不良做法之外,还有哪些替代方法呢? - gast128
您还可以使用一组 MyClass 指针,它们是可哈希/可排序的,与其变量无关。(即,您可以通过指针修改其变量) - cid

15

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接