std :: map:使用自定义运算符时更新密钥

时间:2017-03-27 12:06:04

标签: c++ c++11 stl std stdmap

当使用std::map<KeyType,ValueType,Comparator>的自定义运算符时,其设计仅比较了我的一些KeyType字段,两个对象KeyType k1, k2可能包含不同的数据,但对于地图而言,它们看起来很可能喜欢同样的钥匙。毕竟,这就是我们首先编写自定义Comparator的原因。

所以,如果我写

map[k1] = 1;
map[k2] = 2;

使用k1和k2使比较器报告它们相等,地图将包含键/值对{k1, 2}

{k1, 1}替换{k2, 2}对的最优雅方法是什么,或者是先擦除k1然后插入k2的唯一方法?

1 个答案:

答案 0 :(得分:1)

我可以找到两种不同的方法,用等效的键替换地图中的键:

快速而肮脏的方法

只需swap一个密钥与另一个密钥, UB,但大多数std::map实现都应该没问题:

std::swap(const_cast<Key&>(map.find(k2)->first), k2);

Demo

不那么快且不太脏的方法

提供调整const方法Key,以更改其内部状态:

void adjust(const Key& other) const { value = other.value; }

检查此方法是否会将Key转换为等效Key的改进。

Demo(OP的改进)。

相关问题