C++ STL中对list中的元素进行排序
list 的成员函数 sort()有两个版本,其中一个没有参数:
linkInts.sort(); // sort in ascending order
另一个接受一个二元谓词函数作为参数,让您能够指定排序标准:
bool SortPredicate_Descending (const int& lhs, const int& rhs)
{
// define criteria for list::sort: return true for desired order
return (lhs > rhs);
}
// Use predicate to sort a list:
linkInts.sort (SortPredicate_Descending);
程序清单 18.6 演示了这两个版本。
0: #include <list>
1: #include <iostream>
2: using namespace std;
3:
4: bool SortPredicate_Descending (const int& lhs, const int& rhs)
5: {
6: // define criteria for list::sort: return true for desired order
7: return (lhs > rhs);
8: }
9:
10: template <typename T>
11: void DisplayContents (const T& container)
12: {
13: for (auto element = container.cbegin();
14: element != container.cend();
15: ++ element )
16: cout << *element << ' ';
17:
18: cout << endl;
19: }
20:
21: int main ()
22: {
23: list <int> linkInts{ 0, -1, 2011, 444, -5 };
24:
25: cout << "Initial contents of the list are - " << endl;
26: DisplayContents (linkInts);
27:
28: linkInts.sort ();
29:
30: cout << "Order after sort():" << endl;
31: DisplayContents (linkInts);
32:
33: linkInts.sort (SortPredicate_Descending);
34: cout << "Order after sort() with a predicate:" << endl;
35: DisplayContents (linkInts);
36:
37: return 0;
38: }
输出:
Initial contents of the list are -
0 -1 2011 444 -5
Order after sort():
-5 -1 0 444 2011
Order after sort() with a predicate:
2011 444 0 -1 -5
分析:
该示例演示了如何对整型 list 进行排序。第 28 行演示了不带参数的 sort()函数的用法,它使用运算
符<比较整数(就整型而言,该运算符是由编译器实现的),并将元素按默认的升序排列。然而,如果
程序员要覆盖这种默认行为,必须向 sort 函数提供一个二元谓词,如第 33 行所示。第 4~8 行定义了
函数 SortPredicate_Descending,它是一个二元谓词,帮助 list 的 sort()函数判断一个元素是否比另一个
元素小。如果不是,则交换这两个元素的位置。换句话说,您告诉了 list 如何解释小于,就这里而言,
小于的含义是第一个参数大于第二个参数。这个谓词仅在第一个值比第二个值大时返回 true。也就是
说,使用该谓词时,仅当第一个元素( lsh)的数字值比第二个元素( rsh)大时, sort()才认为第一个元
素比第二个元素小。基于这种解释, sort()交换元素的位置,以满足谓词指定的标准。