[英]When using std::map should I overload operator== for the key type?
std :: map不应该有重复的密钥,所以当我有自定义类型时它如何知道我有一个重复的密钥,我是否需要做重载重载操作符==? 或者它将被隐式创建?
根据文档,我只需要操作员<但这不足以维持密钥的独特性。
考虑这个例子:
class MyType{
public:
MyType(int newId){
id = new int;
*id = newId;
};
~MyType{
delete id;
}
private:
int* id;
};
int main(){
std::map<MyType,int> myMap;
std::pair<std::map<MyType,int>::iterator,bool> ret;
ret = myMap.insert ( std::pair<MyType,int>(myType(2),100) );
if (!ret.second) {//now how can he knows that?
std::cout << "element already existed" << endl;
}
}
std::map
不关心键的文字单一性 。 它关心密钥等价 。 当a < b
和b < a
a < b
都不为真时,键a
和b
在定义上是等价的。
另请注意, std::map
不直接使用operator <
。 std::map
对operator <
不知道任何事情。 相反, std::map
使用比较谓词,其类型被指定为std::map
模板的第三个参数。 该参数的默认值为std::less
。 std::less
实现将比较委托给operator <
(除非有特殊的不同)。 这就是operator <
发挥作用的方式。 但是你总是可以提供你自己的谓词,它不一定会使用operator <
。
但无论如何,这里的关键时刻是std::map
使用排序“less”比较而只是“less”比较。 它不需要也不关心任何“平等”比较。
同时, std::unordered_map
将是一个不同的故事。 它依赖于谓词指定的非有序“相等”比较。 默认情况下,它是std::equal_to
。 std::equal_to
实现委托调用operator ==
(除非有特殊的不同)。
运营商<就够了。 可以通过测试<b和b <a返回false来检查平等。
你应该重载operator<
。
std::map
将使用!(a < b) && !(b < a)
作为唯一性测试来比较密钥。
订单关联容器仅使用严格的弱订单来标识它们的密钥。 他们不会使用operator==()
。 用于定位对象的唯一比较是std::map<K, V, Compare, Allocator>
的第三个模板参数。
比较用于将密钥分组为等价集。 两个键k1
和k2
都认为,如果既不等同k1
小于k2
也不k2
小于k1
:
bool equivalent = !(k1 < k2) && !(k2 < k1);
当然,关联容器实际上会使用更像的东西
!predicate(k1, k2) && !predicate(k2, k1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.