更新std :: map中键的值

Pir*_*ooz 12 c++ stl map

假设我们有一个简单的结构,如下所示

struct T{
  int x;
  int y;
};
T t1, t2;
Run Code Online (Sandbox Code Playgroud)

还假设我有一个map<T, int> myMap和两个类型的结构仅T使用它们的x值进行比较.即t1 < t2iff t1.x < t2.x.我试图y通过myMap 更新键的一些值.这不应该影响地图看到键的方式.除了删除旧元素和插入新元素之外还有什么方法吗?

Ker*_* SB 13

如果您确定y不参与类的"逻辑状态"并且仅仅是实现细节,那么您可以声明它mutable:

struct T
{
  int x;
  mutable int y;
  bool operator<(const T& rhs) const { return x < rhs.x; }
};
Run Code Online (Sandbox Code Playgroud)

现在你应该能够改变y:

for (auto it = m.begin(); it != m.end(); ++it)
{
  it->first.y = -2; // ouch? But it won't invalidate the map's invariants.
}
Run Code Online (Sandbox Code Playgroud)


Cat*_*lus 9

不,map不能让你修改密钥,因为这可能使地图不变量(元素的排序)无效 - 你知道它不会,但是map不能知道,所以它在谨慎方面是错误的,并且不允许这样做.

删除并重新插入是一种正确的方法.将密钥视为不可变的.