C++ 当使用std::map时,是否应该为键类型重载运算符==?
映射不应该有重复的键,所以当我有一个自定义类型时,它如何知道我有一个重复的键,我需要做重载操作符==?或者它将被隐式创建 根据文档,我只需要操作员<,但这不足以保持钥匙的唯一性 考虑这个例子:C++ 当使用std::map时,是否应该为键类型重载运算符==?,c++,stl,C++,Stl,映射不应该有重复的键,所以当我有一个自定义类型时,它如何知道我有一个重复的键,我需要做重载操作符==?或者它将被隐式创建 根据文档,我只需要操作员
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;
}
}
类MyType{
公众:
MyType(int-newId){
id=新的int;
*id=newId;
};
~MyType{
删除id;
}
私人:
int*id;
};
int main(){
std::map myMap;
std::配对ret;
ret=myMap.insert(std::pair(myType(2),100));
如果(!ret.second){//现在他怎么知道?
std::cout操作符<就足够了。可以通过测试a您应该重载操作符顺序关联容器仅使用严格的弱顺序来标识它们的键。它们不会使用操作符==()
。用于定位对象的唯一比较是std::map
的第三个模板参数
比较用于将键分组为等价集。如果k1
和k2
都不小于k2
或k2
都不小于k1
,则认为这两个键是等价的:
bool equivalent = !(k1 < k2) && !(k2 < k1);
std::map
不关心键的文字唯一性。它关心键的等价性。当a和b都不为真时,键a和b在定义上是等价的
<> >注意:<代码> STD::MAP < /代码>不直接使用<代码>运算符OH,当然,谢谢,所以即使我实现了操作符==自己,它也会被忽略?YUP,map的实现只使用@ Jasper:实际上,不检查相等性!检查的是等价的!没关系的,那么,考虑一个由<代码> STD组成的密钥:配对
,其中只有第一个
组件用于排序比较:对象可能不相等,但它们仍然可以被视为相等。当然,将要检查的内容是运算符定义的内容。(无论您将其命名为相等还是相等).Equality在您的示例中确实是一个更好的名称,您的类型MyType
违反了三/五规则。这里不需要动态分配。我知道这只是一个示例。这不是重点…应该注意的是,C++20删除了委托的map
比较运算符,但等式操作符并用太空船操作符替换它们。@David G:你到底指的是什么?据我所见,在C++20中,std::map仍然使用std::less
,而主std::less
模板仍然使用我指的是一套比较操作符(除相等运算符外)C++20之前使用的std::map
(例如templatebool运算符!=(常量std::map&lhs,常量std::map&rhs)
现在包含在地图值类型的spaceship操作符中,操作符随后从中合成。std::less
将使用
!predicate(k1, k2) && !predicate(k2, k1)