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



当对std::map<KeyType,ValueType,Comparator>使用自定义运算符时,根据设计,该运算符仅比较我的某些KeyType字段,则两个对象KeyType k1, k2可能包含不同的数据,但对于映射,它们看起来像相同的键。毕竟,这就是我们最初编写自定义比较器的原因。

所以如果我写

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

如果 k1 和 k2 使得比较器将它们报告为相等,则映射将包含键/值对{k1, 2}

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

我可以找到两种不同的方法,将映射中的键替换为等效的键:

快速而肮脏的方法

只需swap另一个键,它就是 UB,但对于大多数std::map实现来说应该没问题:

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

演示。

不那么

快速和不那么脏的方法

提供更改其内部状态的调整const方法Key

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

一个改进是检查此方法是否将Key转换为等效Key

演示(改进 OP(。

最新更新