为什么std :: map重载运算符<不使用Compare

ath*_*hos 8 c++ stl

来自http://www.cplusplus.com/reference/map/map/operators/我注意到:

"请注意,这些操作都没有考虑任何容器的内部比较对象,而是直接比较元素(类型为value_type)."

这就是说重载的运算符"<" Compare在其声明中没有使用它(参见http://www.cplusplus.com/reference/map/map/)

std::map
template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;
Run Code Online (Sandbox Code Playgroud)

其中,Compare

比较:二元谓词,它将两个元素键作为参数并返回一个bool.表达式comp(a,b),其中comp是这种类型的对象,a并且b是键值,如果在函数定义的严格弱顺序中a被认为是之前b的那个,则返回true .map对象使用这个表达式来确定元素在容器中遵循的顺序以及两个元素键是否相等(通过比较它们:它们是等效的!comp(a,b) && !comp(b,a)).如果地图容器中没有两个元素可以具有等效键.这可以是函数指针或函数对象(参见构造函数).默认为 less<T>,返回与应用less-than运算符相同 (a<b).别名为会员类型map::key_compare.

我不太明白,为什么不在Compare"<"运算符中使用?

jua*_*nza 3

为什么std::map重载operator <不使用Compare

一个很好的理由是确保行为有意义并不容易。鉴于Compare函子可以是有状态的,同一类型的两个映射可能具有完全不同的排序标准。例如,

struct Cmp
{
  Comp(bool flip) : flip(flip) {}

  bool operator()(int lhs, int rhs) const
  {
    return flip ? lhs < rhs : rhs < lhs;
  }

  bool flip;
};
Run Code Online (Sandbox Code Playgroud)

这两个映射具有相同的类型,但顺序不同:

std::map<int, std::string, Cmp> m0(Cmp(false));
std::map<int, std::string, Cmp> m1(Cmp(true));

bool b = m0 < m1; // which Cmp should this use?
Run Code Online (Sandbox Code Playgroud)

这不一定是使用 etc 的原因<,但却是不使用 的充分理由Compare