假设我们有一个简单的结构,如下所示
struct T{
int x;
int y;
};
T t1, t2;
Run Code Online (Sandbox Code Playgroud)
还假设我有一个map<T, int> myMap
和两个类型的结构仅T
使用它们的x
值进行比较.即t1 < t2
iff 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)
不,map
不能让你修改密钥,因为这可能使地图不变量(元素的排序)无效 - 你知道它不会,但是map
不能知道,所以它在谨慎方面是错误的,并且不允许这样做.
删除并重新插入是一种正确的方法.将密钥视为不可变的.