从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
是一个对象 此类型的a
和b
是关键值,如果a
,则返回true 被认为是在b
之前的严格弱点命令函数 定义。 map对象使用此表达式来确定两者 命令元素跟随容器和两个元素 键是等价的(通过反思地比较它们:它们是 相当于!comp(a,b) && !comp(b,a))
。地图中没有两个元素 容器可以有等效的键。这可以是函数指针或 一个函数对象(参见示例的构造函数)。默认为less<T>
,返回与应用less-than运算符相同的内容(a<b)
。别名为成员类型map::key_compare
。
我不太明白,为什么不在“&lt;”中使用Compare
操作
答案 0 :(得分:4)
Compare
用于比较key_type
。地图的<
运算符实际上是在比较 mapped_type
value_type
,而不是key_type
,因此Compare
不适用。 value_type
是一对key_type
和mapped_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
的理由。