Effective STL学习笔记-条款31
来源:互联网 发布:微信假红包软件生成器 编辑:程序博客网 时间:2024/06/05 03:35
了解你的排序选择
个人认为掌握并灵活的使用stl的算法,对我们c++编程有着事半功倍的效果,排序算法的使用和掌握更加重要。
使用的最多的算法可能就是sort了,或者qsort(条款46的存在可能会让更多人倾向于使用sort而不是qsort)。例如有一个Widget的Vector,你需要挑选出Widget质量最好5个,剩下的可以保持无序。
这时候我们不需要完全排序,sort显得有些浪费。
而partail_sort可以胜任这个目标:
partail_sort
struct Widget{ Widget(int value) :m_value(value) {} int m_value;}; vector<Widget> vec = { Widget(0), Widget(11), Widget(12), Widget(3), Widget(8), Widget(6), Widget(2), Widget(1), Widget(8), Widget(7), Widget(10), Widget(9) }; std::partial_sort(vec.begin(), vec.begin() +5, vec.end(), [](const Widget& lhs, const Widget& rhs) { return rhs.m_value < lhs.m_value; }); for (auto v : vec) { cout << " element : "<<v.m_value << endl; }
可以看到只是前5个元素进行了排序。这对于大容器很实用。
nth_element
按照文档的解释应该是不关心顺序的得到质量较好的Widget,而partail_sort则关心这个顺序(实际上在我的测试中nth_element也都是排序的状态,不知是否是我理解错误,希望有人可以指出!!!)
图片来自于原书
稳定算法stable_sort
稳定的含义就是例如:未排序的时候A在B之前并且两者质量相同,在排序之后A依旧会在B之前,而partail_sort、nth_element不关心这个顺序。
排序用法
- 比如我们想要获取中间值的大小
- 获取75%的大小
- 第二大的值
等等。
以下给出简单示例,没有其他的安全判断,供参考。
std::nth_element(vec.begin(), vec.begin() + vec.size() / 2, vec.end(), [](const Widget& lhs, const Widget& rhs) { return rhs.m_value < lhs.m_value; }); cout << " min value : " << vec[vec.size() / 2].m_value << endl;
std::nth_element(vec.begin(), vec.begin() + vec.size() * 0.25, vec.end(), [](const Widget& lhs, const Widget& rhs) { return rhs.m_value < lhs.m_value; }); cout << " 75% value : " << vec[vec.size() * 0.25].m_value << endl;
std::nth_element(vec.begin(), vec.begin() + 1, vec.end(), [](const Widget& lhs, const Widget& rhs) { return rhs.m_value < lhs.m_value; }); cout << " second value : " << vec[1].m_value << endl;
partition
有时候你需要质量等级为10级以上的Widget,而其他的属于不合格的。如果使用sort等,你需要排序并找到第一个不符合要求的位置,这样略嫌麻烦。而partition实现的功能就是分开符合某一标准的元素都在区间开头。
auto iterGoodEnd = std::partition(vec.begin(), vec.end(), [=](const Widget& item) { return item.m_value > 10; }); auto iterBegin = vec.begin(); while (iterBegin != iterGoodEnd) { cout << (*iterBegin).m_value << endl; ++iterBegin; }
总结
另外性能很可能也是我们关注的一点,按照需要更少的资源(时间、空间)排序:
- partition
- stable_partition
- nth_element
- partition_sort
- sort
- stable_sort
阅读全文
0 0
- Effective STL学习笔记-条款31
- 【Effective STL】条款1-5学习笔记
- 【Effective STL】条款6-12学习笔记
- 【Effective STL】条款13-18学习笔记
- Effective STL学习笔记-条款1
- Effective STL学习笔记-条款7
- Effective STL学习笔记-条款8-9
- Effective STL学习笔记-条款13|14
- Effective STL学习笔记-条款19
- Effective STL学习笔记-条款20
- Effective STL学习笔记-条款21
- Effective STL学习笔记-条款23
- Effective STL学习笔记-条款24
- Effective STL学习笔记-条款30
- Effective STL学习笔记-条款32
- Effective STL学习笔记-条款33
- Effective STL学习笔记-条款34
- Effective STL学习笔记-条款36
- 【初探第二章】 策略模式
- Longest Valid Parentheses--LeetCode
- 把python程序转成.exe
- ios和android 浏览器适配问题总结
- Android mark
- Effective STL学习笔记-条款31
- ios架构之-viper模式
- JQuery第二章:DOM(学习笔记)
- python(十一)上:RabbitMQ 使用详细介绍
- python 生成 ppt word outmail excel
- Struts 2中<s:generator>标签的用法
- Java设计模式——创建型
- iOS 代码规范~get方法、const用法
- hadoop yarn方式执行mapreducejob一致peding,卡住不动