繁体   English   中英

当使用std :: map我应该重载operator ==的密钥类型?

[英]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 < bb < a a < b都不为真时,键ab在定义上是等价的。

另请注意, std::map不直接使用operator < std::mapoperator <不知道任何事情。 相反, 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>的第三个模板参数。

比较用于将密钥分组为等价集。 两个键k1k2都认为,如果既不等同k1小于k2也不k2小于k1

bool equivalent = !(k1 < k2) && !(k2 < k1);

当然,关联容器实际上会使用更像的东西

!predicate(k1, k2) && !predicate(k2, k1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM