我遇到的问题的最小例子如下:
#include <set>
using namespace std;
class foo {
public:
int value, x;
foo(const int & in_v) {
value = in_v;
x = 0;
}
bool operator<(const foo & rhs) const {
return value < rhs.value;
}
};
int main() {
foo y(3);
set<foo> F;
F.insert(y);
// Now try to modify a member of the set
F.begin()->x=1;
return 0;
}
错误error: assignment of data-member ‘foo::value’ in read-only structure
。我觉得我在这里遗漏了一些简单的东西,但为什么我无法在课堂上修改成员x
?
答案 0 :(得分:17)
set
中的对象是不可变的;如果要修改对象,则需要:
set
,set
和set
看起来像这样:
std::set<int> s;
s.insert(1);
int x = *s.begin(); // (1)
x+= 1; // (2)
s.erase(s.begin()); // (3)
s.insert(x); // (4)
答案 1 :(得分:8)
鉴于“x”变量不参与小于比较,在这种情况下,使“x”可变是安全的,允许您从集合中修改它。您的类定义将变为:
class foo {
public:
int value;
mutable int x;
foo(const int & in_v) : value(in_v), x(0) { }
bool operator<(const foo & rhs) const {
return value < rhs.value;
}
};
现在您可以在std :: set中使用它并根据需要修改x。在这种情况下,保留数据结构的两个副本是没有意义的,就像上一张海报所建议的那样。
答案 2 :(得分:2)
根据operator<
的定义(即仅考虑值return value < rhs.value
而忽略x
),我想知道您是否需要map
而不是set
{1}}。在map
中,second
值 是可变的。