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

时间:2015-01-06 13:57:56

标签: 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;

Compare

  

比较:一个二元谓词,它将两个元素键作为参数   并返回bool。表达式comp(a,b),其中comp是一个对象   此类型的ab是关键值,如果a,则返回true   被认为是在b之前的严格弱点命令函数   定义。 map对象使用此表达式来确定两者   命令元素跟随容器和两个元素   键是等价的(通过反思地比较它们:它们是   相当于!comp(a,b) && !comp(b,a))。地图中没有两个元素   容器可以有等效的键。这可以是函数指针或   一个函数对象(参见示例的构造函数)。默认为   less<T>,返回与应用less-than运算符相同的内容   (a<b)。别名为成员类型map::key_compare

我不太明白,为什么不在“&lt;”中使用Compare操作

2 个答案:

答案 0 :(得分:4)

Compare用于比较key_type。地图的<运算符实际上是在比较 mapped_type value_type,而不是key_type,因此Compare不适用。 value_type是一对key_typemapped_type

老实说,我认为首先给地图operator<是一个操作符重载太远的情况。一个地图“小于”另一个地图的意思并不是很明显。如果你想要lexigraphical_compare,我建议你直接调用它,或者至少在你的代码中记录你的地图比较意味着什么。

答案 1 :(得分: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;
};

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

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?

这不一定是使用<等的原因,但不是使用Compare的理由。