当对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(。