【发布时间】:2011-02-18 15:22:37
【问题描述】:
看来我可以对std::vector<std::pair<int, std::string>>进行排序,它会根据int值进行排序。这是一个定义明确的事情吗?
std::pair 是否有基于其元素的默认排序?
【问题讨论】:
看来我可以对std::vector<std::pair<int, std::string>>进行排序,它会根据int值进行排序。这是一个定义明确的事情吗?
std::pair 是否有基于其元素的默认排序?
【问题讨论】:
std::pair 使用字典比较:它将根据第一个元素进行比较。如果第一个元素的值相等,则会根据第二个元素进行比较。
C++03 标准(第 20.2.2 节)中的定义是:
template <class T1, class T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);
Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).
【讨论】:
operator<即可支持排序。否则他们需要支持更多的排序运算符,并确保它们之间的关系(例如>=是<的否定)。
根据我的 C++0x 标准副本第 20.3.3.26 节,std::pair 定义了一个 operator<,这样对于两对 x 和 y,它会返回
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
我不确定这是否也是 2003 年标准的一部分。我还应该注意,如果元素本身不是 LessThanComparable,则不会编译。
【讨论】:
比较运算符。它使用字典比较:如果 x 的第一个元素小于 y 的第一个元素,则返回值为 true,如果 y 的第一个元素小于 x 的第一个元素,则返回 false。如果这些都不是,则 operator
看起来它实际上是两个元素的组合。
【讨论】:
是的。 operator<() 是为 std::pair<T1, T2> 定义的,假设 T1 和 T2 本身是可比较的。
【讨论】: