我正在使用一个集来保存对象。我想更改集合中的第一个对象。这就是我试过的:
set<myClass>::iterator i = classlist.begin();
i->value = 0;
这是我得到的错误:
error: read-only variable is not assignable
变量是如何变为只读的?如何改变?
答案 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)
原因是因为在一个集合中,密钥是数据本身,当你更改数据时,也就是密钥,这是一个否定的。
微软C ++团队在此报告了这一重大变化: http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx
如果您想要修改数据,并且不想删除和插入,请改用地图。