更新std::map中的键值

updating the value of a key in a std::map

本文关键字:键值 map std 更新      更新时间:2023-10-16

假设我们有一个像下面这样的简单结构

struct T{
  int x;
  int y;
};
T t1, t2;

还假设我有一个map<T, int> myMap,并且两个T类型的结构仅使用它们的x值进行比较。即t1 < t2t1.x < t2.x。我试图在myMap上更新一些键的y值。这应该不会影响地图看到钥匙的方式。除了删除旧元素并插入新元素之外,还有其他方法吗?

如果您确定y不参与类的"逻辑状态",而仅仅是一个实现细节,那么您可以将其声明为mutable:

struct T
{
  int x;
  mutable int y;
  bool operator<(const T& rhs) const { return x < rhs.x; }
};
现在你应该可以修改y:
for (auto it = m.begin(); it != m.end(); ++it)
{
  it->first.y = -2; // ouch? But it won't invalidate the map's invariants.
}

不,map不能让你修改键,因为这会使映射不变量(元素的排序)失效——你知道它不会,但map不知道,所以它会小心行事,不允许这样做。

删除并重新插入是正确的方法。

如果y不参与比较,可以将其标记为mutable,这样即使值不变也可以修改。

std::map的键为const。所以你不能改变它。

同样,如果您只使用x来比较键,那么为什么要使用std::map<T,int>呢?

std::map<int, std::pair<T,int> > data; //where keys would be t.x

毕竟,在地图中,键是有效的t.x

如果不影响比较运算符的行为,可以修改T::y。另一方面,修改map的键是不好的风格,它应该是不可变的。标准库的一些实现确实允许修改key.

键在map中是const,尝试将新值复制到新map中

就像Cat说的,你不应该换钥匙,因为有很多很好的理由,但你似乎知道足够的东西来继续前进。

用const_cast抛弃键的constness,你就不能做各种伤害....犯错的变化。只需仔细检查比较操作符在修改后是否仍然返回相同的值。