std::pair<int, std::string>的排序是否定义良好?

39

看起来我可以对一个std::vector<std::pair<int, std::string>>进行排序,它将基于int值进行排序。这样做是明确定义的吗?

std::pair是否具有基于其元素的默认排序?

4个回答

60

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).

1
为什么他们不使用更简单的形式 (y.first >= x.first),而是 less + negation 的形式? - Patrick Roncagliolo
1
@PatrickRoncagliolo 这种方式只需要用户定义的类型实现 operator< 来支持排序。否则,它们需要支持更多的排序运算符,并确保它们之间的关系(例如,>=< 的否定)。 - interjay
所以这不是与<和<=的效率相关的某种优化技巧。好知道。谢谢。 - Patrick Roncagliolo

10
根据我手头的C++0x标准第20.3.3.26节,std::pair定义了一个operator<,用于比较两个成对的值x和y,返回结果为:
x.first < y.first || (!(y.first < x.first) && x.second < y.second)

我不确定这是否也是2003标准的一部分。我还应该注意,如果元素本身不可比较大小,则这将无法编译。


2

SGI文档

比较运算符。它使用词典顺序比较:如果x的第一个元素小于y的第一个元素,则返回值为true,如果y的第一个元素小于x的第一个元素,则返回值为false。如果都不是这种情况,则operator<返回比较x和y的第二个元素的结果。只有当T1和T2均可比较大小时才能使用此运算符。这是一个全局函数,不是成员函数。

看起来实际上是两个元素的组合。


2
是的。假设T1T2本身是可比较的,std::pair<T1, T2>定义了operator<()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接