将自定义类型作为地图的可能键的可能方法有哪些

时间:2014-02-11 09:34:26

标签: c++ dictionary std stdmap c++-standard-library

最近我被问到如何将自定义类型作为stl :: map的可能键的问题。

直接向前我回答他们重载“<”运算符函数以支持自定义类型。这是“custom type链接”链接

当他们问我哪个方面可以解决这个问题。我只是暗示我们也可以通过重载“==”运算符来实现。但他对答案不满意。

请帮助我知道,如果有任何其他方法可以解决此问题“将自定义类型设为地图的可能键”。

2 个答案:

答案 0 :(得分:4)

std::map需要小于(或等效; less<key_type>是默认值,每个表102),比较键类型。

  

[C++11: 23.2.4/3]:短语“等价键”表示比较所强加的等价关系, operator==键。也就是说,如果对于比较对象k1,则认为两个键k2comp, comp(k1, k2) == false && comp(k2, k1) == false是等效的。对于同一容器中的任意两个键k1k2,调用comp(k1, k2)应始终返回相同的值。

因此,您可以提供非less<key_type>的比较器函数,以避免调用operator<,但上面定义的最终结果必须相同。 operator==完全无关紧要。

#include <iostream>
#include <map>

/**
 * A comparator that defines strict-weak ordering,
 * but is backwards!
 */
struct Comp
{
   bool operator()(const int& lhs, const int& rhs)
   { return rhs < lhs; }
};

int main()
{
   {
      std::map<int, char> m;        // uses default less<int> comparator
      m[0] = 'a';
      m[1] = 'b';
      m[2] = 'c';

      for (auto el : m)
         std::cout << el.second;    // "abc"
   }
   {
      std::map<int, char, Comp> m;  // uses my own comparator defined above
      m[0] = 'a';
      m[1] = 'b';
      m[2] = 'c';

      for (auto el : m)
         std::cout << el.second;    // "cba"  ... which is true ;)
   }
}

Live demo

答案 1 :(得分:1)

此处std::maps with user-defined types as key 你有办法专门为你的自定义类使用比较器函数std :: map。

可能面试官不高兴因为==无法提供日志(N)时间方法来访问 地图的价值。实际上,如果只是你必须检查整套键是否相等 提供平等。地图不能仅用于相等。