更新std::map中的键值
updating the value of a key in a std::map
假设我们有一个像下面这样的简单结构
struct T{
int x;
int y;
};
T t1, t2;
还假设我有一个map<T, int> myMap
,并且两个T
类型的结构仅使用它们的x
值进行比较。即t1 < t2
或t1.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,你就不能做各种伤害....犯错的变化。只需仔细检查比较操作符在修改后是否仍然返回相同的值。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何使用 std::variant 打印地图键/值?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- C++ 映射的键/值的用户自定义名称?
- 试图(稍微)概括C++模板.关联容器键:值反转
- 更改多重映射容器中所有元素的键值
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- C++ std::map 缓存,使用 std::string 作为键值
- 为什么 std:map 不能接受指针作为键值?
- 将键值对文件读入 std::map
- 如何从std::map值的std::向量中找到最小键值
- 如何在std::map上迭代返回基于键值排序的元素
- 如何通过键从map中获取值
- 从字符串中获取键/值对并存储在map中
- 更新std::map中的键值
- 在c++中迭代std::map的键/值
- 如何创建std::map键值随机
- 使用std::map C++的多个键值
- 用c++计算map中的键值
- 如果在std::map中操作不存在的键值对会发生什么?