C++ STL中对list中的元素进行排序

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()交换元素的位置,以满足谓词指定的标准。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值