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)