如何更改集合中的对象子成员

How to change object child members in a set

本文关键字:对象 成员 何更改 集合      更新时间:2023-10-16

我使用set来保存对象。我想改变集合中的第一个对象。这是我尝试过的:

set<myClass>::iterator i = classlist.begin();
i->value = 0;

这是我得到的错误:

error: read-only variable is not assignable

变量是如何变成只读的?怎样才能改变呢?

集合中的内容实际上是只读的——您不能原位更改集合中成员的值。您所能做的就是删除它,并添加一个具有所需新值的新成员。这个限制是必要的,因为std::set的二叉树实现。

如果您真的必须修改set中的元素,则该元素必须是一旦从set中删除并重新插入到set中。
例如:

set<myClass>::iterator i = classlist.begin();
myClass c = *i;
c.value = 0;
classlist.erase( i );
classlist.insert( c );

如果operator< for myClass没有引用value成员,你可以用std::map代替set。假设一个新的myClass没有value成员,设value成员类型为T,那么std::map< newMyClass, T >就可以达到目的了

在VS2008下编译:

#include <set>
struct myClass{
    int value;
    int comp;
};
bool operator<(const myClass& lhs,const myClass& rhs){
    return lhs.comp<rhs.comp;
}
int main(){
    std::set<myClass> classlist;
    myClass c;
    classlist.insert(c);
    std::set<myClass>::iterator i=classlist.begin();
    i->value=0;
    return 0;
}

但这只是巧合。operator<比较comp成员,修改value成员

在Visual Studio 2010中,当微软更新STL时,他们将所有迭代器设置为常量。所以set::iterator和set::const_iterator是一样的

原因是因为在set中,键就是数据本身,当你改变数据时,键也随之改变,这是一个no no。

微软c++团队在这里报告了这个突破性的变化:http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl -破坏-修改- -视觉工作室- 2010 -β- 1. - aspx

如果你想修改你的数据,而不希望删除和插入,那么使用映射。