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

时间:2011-05-03 21:52:32

标签: c++ class object set

我正在使用一个集来保存对象。我想更改集合中的第一个对象。这就是我试过的:

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

这是我得到的错误:

error: read-only variable is not assignable

变量是如何变为只读的?如何改变?

4 个答案:

答案 0 :(得分:1)

集合中的内容实际上是只读的 - 您无法在原位更改集合成员的值。您所能做的就是删除它,并添加一个具有所需新值的新成员。由于std :: set。

的二叉树实现,这种限制是必要的

答案 1 :(得分:1)

如果你真的需要修改set中的元素,那么元素必须是 一旦从set删除并重新插入set 例如:

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

如果operator<的{​​{1}}未引用myClass成员, 您可以使用value代替std::map。 假设一个新的set没有myClass成员, 并假设value成员的类型为value, 然后T将达到目的。

答案 2 :(得分:0)

这在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成员。

答案 3 :(得分:0)

在Visual Studio 2010中,当Microsoft更新STL时,它们使所有迭代器保持不变。所以set :: iterator和set :: const_iterator都是一样的。

原因是因为在一个集合中,密钥是数据本身,当你更改数据时,也就是密钥,这是一个否定的。

微软C ++团队在此报告了这一重大变化: http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx

如果您想要修改数据,并且不想删除和插入,请改用地图。