在只读结构中分配数据成员,在STL集中分配类

时间:2010-09-23 04:14:21

标签: c++ stl

我遇到的问题的最小例子如下:

#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

3 个答案:

答案 0 :(得分:17)

set中的对象是不可变的;如果要修改对象,则需要:

  1. set
  2. 制作对象的副本
  3. 修改副本,
  4. set
  5. 中删除原始对象
  6. 将副本插入set
  7. 看起来像这样:

    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 是可变的。