如何更改集合中的对象子成员
How to change object child members in a set
我使用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
如果你想修改你的数据,而不希望删除和插入,那么使用映射。
相关文章:
- 指向设备对象成员的指针
- 访问由unique_ptr传递的对象成员
- 引用对象成员函数的成员函数
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- Lua C API - 从C++分配和使用类的对象成员
- Rapidjson 遍历并获取复杂 JSON 对象成员的值
- 类对象成员变量在调用函数时不会更改
- 对象成员变量还是继承
- C++多态性:有没有办法找到对象成员函数的地址?
- 重载对象成员的比较运算符
- 获取未初始化对象成员的地址是否定义良好?
- 在优先级队列被推送到队列后,如何编辑对象成员
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 通过 std::bind 从对象成员检索值
- 保留对象成员变量的本地副本
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 没有默认构造函数的对象成员的 wig setter
- 对象成员数组C++默认初始化
- 如何在数组中添加对象成员
- 使用聚合创建和关联两个不同的对象成员