有时候不需要全部排序,比如你有一个存放Widget的向量,而你希望讲质量最好的送给顾客,那么只需要排前20个最好的Widget,其他的而不用排序,partial_sort可以实现这样的功能:

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;bool qualityCompare(const int& a, const int& b)
{return a > b;//从大到小排序
}int main()
{vector<int> partSortExapmle;//partSortExample的前20个位置顺序存放了整个容器中质量最好的20个元素partial_sort(partSortExapmle.begin(), partSortExapmle.begin() + 20, partSortExapmle.end(), qualityCompare);return 0;
}

排序结果如下,前20个元素按照从大到小排列,后边的不管

如果只是关心前20个最大的元素,但是不关心前20个元素的排列顺序,乐意使用nth_element()

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;bool qualityCompare(const int& a, const int& b)
{return a > b;//从大到小排序
}int main()
{vector<int> partSortExapmle;for (int i = 0; i < 30; i++){partSortExapmle.push_back(rand());}//partSortExample的前20个位置顺序存放了整个容器中质量最好的20个元素nth_element(partSortExapmle.begin(), partSortExapmle.begin() + 19, partSortExapmle.end(), qualityCompare);for (vector<int>::iterator it = partSortExapmle.begin(); it != partSortExapmle.end(); it++){cout << *it << endl;}return 0;
}


运行结果可以看出来,前20个元素最大,但是没有排序,但是注意前20个的时候需要写的是19,因为nth_element()使得位置n上的元素正好是全排列情况下的第n个元素,而且在位置n之前的都比它大,在n之后的都比n小。一定注意n是19,19是index。

partial_sort和nth_element和sort都属于非稳定性的排序算法,但是有一个名为stable_sort的算法可以提供稳定的排序特性。

stable_sort(partSortExapmle.begin(), partSortExapmle.end());

nth_element()还有很多用途,比如,找到一个区间的中间值,或者找到某个特定百分比的值。

//partSortExample中的中位数,即中间的元素nth_element(partSortExapmle.begin(), partSortExapmle.begin() + partSortExapmle.size()/2, partSortExapmle.end(), qualityCompare);//因为函数的排序为从小到大,所以这是找到排序为75%的数。nth_element(partSortExapmle.begin(), partSortExapmle.begin() + partSortExapmle.size()*0.25,partSortExapmle.end(), qualityCompare);

partition算法可以将满足条件的数据放在容器的前边,并返回指向第一个不满条件元素位置的迭代器。因此在v.begin()和goodEnd之间全部是满足条件的数据。与它相应的是stable_partition算法。

#include<iostream>
#include<algorithm>
#include<vector>using namespace std;bool qualityCompare(const int& a, const int& b)
{return a > b;//从大到小排序
}
bool hasAcceptableQuality(int num)
{if (num % 2 == 0)return true;elsereturn false;
}
int main()
{vector<int> partSortExapmle;for (int i = 0; i < 100; i++){partSortExapmle.push_back(rand());}vector<int>::iterator goodEnd = partition(partSortExapmle.begin(), partSortExapmle.end(), hasAcceptableQuality);vector<int>::iterator goodEnds = stable_partition(partSortExapmle.begin(), partSortExapmle.end(), hasAcceptableQuality);int i = 1;for (vector<int>::iterator it = partSortExapmle.begin(); it != partSortExapmle.end(); it++){cout << i++ << ":" << *it << endl;}return 0;
}

我们总结一下你的排序选择:
● 如果你需要在vector、string、deque或数组上进行完全排序,你可以使用sort或stable_sort。
● 如果你有一个vector、string、deque或数组,你只需要排序前n个元素,应该用partial_sort。
● 如果你有一个vector、string、deque或数组,你需要鉴别出第n个元素或你需要鉴别出最前的n个元素,
而不用知道它们的顺序,nth_element是你应该注意和调用的。
● 如果你需要把标准序列容器的元素或数组分隔为满足和不满足某个标准,你大概就要找partition或
stable_partition。
● 如果你的数据是在list中,你可以直接使用partition和stable_partition,你可以使用list的sort来代替sort和
stable_sort。如果你需要partial_sort或nth_element提供的效果,你就必须间接完成这个任务,但正如我在上面勾画的,会有很多选择。

按照需要资源的大小从小到大排列的是:
partition < stable_partiton < nth_elemental < partial_sort < sort < stable_sort.

我对于在这些排序算法之间作选择的建议是让你的选择基于你需要完成的任务上,而不是考虑性能。如果你选择的算法只完成了你需要的(比如用partition代替完全排序),你能得到的不仅是可以最清楚地表达了你要做的代码,而且是使用STL最高效的方法来完成它。

关联容器可以保证元素保持特定的顺序,也可以使用标准的非STL容器priority_queue,他总是保持元素的顺序关系。但是优先队列不支持迭代器。

effective stl 第31条:了解与各种排序相关的选择相关推荐

  1. 【C++】Effective STL:50条有效使用STL的经验

    第一条:慎重选择容器类型 1.C++容器:先混个眼熟 序列容器:array.vector.string.deque.list.forward_list 有序关联容器:set.map.multiset. ...

  2. 《Effective STL》条款解读

    条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...

  3. 《Effective STL》中文版 读书笔记

    50条有效使用STL的经验 第一条 慎重选择容器类型(20190713) 第二条 不要试图编写独立于容器类型的代码(20190713) 第三条 确保容器中的对象副本正确而高效(20190713) 第四 ...

  4. Effective STL 50条有效使用STL的经验笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  5. Effective STL中文版:50条有效使用STL的经验(双色)

    <Effective STL中文版:50条有效使用STL的经验(双色)> 基本信息 作者: (美)梅耶(Meyers,S.) 译者: 潘爱民 陈铭 邹开红 出版社:电子工业出版社 ISBN ...

  6. 读 S. Meyers 之 《Effective STL 中文版:50条有效使用 STL 的经验》

    S. Meyers, 潘爱民, 陈铭, 邹开红. Effective STL 中文版:50条有效使用 STL 的经验. ISBN: 978-7-121-20125-7 STL (Standard Te ...

  7. 《Effective STL》学习笔记(第一部分)

    本书从STL应用出发,介绍了在项目中应该怎样正确高效的使用STL.本书共有7个小节50个条款,分别为 (1) 容器:占12个条款,主要介绍了所有容器的共同指导法则 (2) vector和string: ...

  8. 《Effective STL》重读笔记整理

    最近有闲,在工作之余重读了<effective STL>一书,并通过 twitter 记了一下笔记,今天整理收集到这里. twitter 真的非常适合记读书笔记,哈哈,以后要好好地发扬.另 ...

  9. 【绝版C++书籍】《Effective STL》读书笔记

    <Effective STL>读书笔记 写在前面 0<Effective STL>中可能过时的内容 1 容器 第1条:慎重选择容器类型. 第2条:不要试图编写独立于容器类型的代 ...

最新文章

  1. 【星云测试】精准测试的软件产品质量效率变化分析
  2. 如何寻找outlook邮件附件直接修改保存后的文档
  3. setTimeout 定时器的使用
  4. 盛佳:搜索是有目的的发现,发现是无目的的搜索
  5. svn在commit后报错:is scheduled for addition, but is missing
  6. easyUI 展开DataGrid里面的行显示详细信息
  7. linux内核模块常见问题
  8. 第六十期:华为:希望把VR/AR打造成下个智能手机产业
  9. Java流程控制语句的基本概念
  10. 地图下载区 哪家好用
  11. 银行业务总揽之-银行对公业务
  12. 黑马程序员JS学习第一天
  13. rk3328摄像头监控
  14. 和平之翼代码生成器 SHCEU 版 4.0.0 Beta2 版 千年隼公布
  15. K8S taint(污点)和tolerations(污点容忍)
  16. 如何成为一名合格的DBA
  17. 创业都是从一个想法开始
  18. PLSQL是什么、为什么要用PLSQL
  19. 2023年,重新扬帆起航!
  20. ftl不存在为真_当两个物体各自以1/2光速运动,朝对方移动,是否可以认为这两个物体在以光速接近?...

热门文章

  1. 基金投资从入门到精通
  2. 【Bootstrap】一个兼容IE8、谷歌等主流浏览器的受众巨幕式风格页面
  3. 2013华为校园招聘机试题
  4. android 文件浏览器源码,android 文件管理器源码
  5. 操作系统--(Linux)LinuxThread vs NPTL
  6. 【零基础】MT4/MT5一条语句让EA发微信消息推送
  7. 递 归 ,递 推 ,贪 心,学 习 总 结
  8. 记录yarn安装全局包,无法使用的问题:‘yo‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  9. Oracle 数据库管理员SYS/SYSTEM密码忘记了,怎么破?
  10. 2022图像翻译/扩散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models