Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

*/-->

div.org-src-container {
font-size: 85%;
font-family: monospace;
}
pre.src {
background-color:#f8f4d7
}
p {font-size: 15px}
li {font-size: 15px}

有些个算法对有序的和无序的数据都能应用,但多数情况下,他们在输入数据有序时才最有用。

下列算法要求输入数据必须有序:

  • binary_search, upper_bound, lower_bound, equal_range

    这些算法均使用了二分查找 (binary_search) 以期达到 logarithmic-time lookups,要求数据必须有序。

  • set_union, set_intersection, set_difference, set_symmeteric_difference

    这些算法要求保证时间复杂度为线性,所以输入数据必须有序。

  • merge, inplace_merge

    这两个算法内部使用 merge sort 来完成运算且要求线性时间,也要求输入必须有序。

  • includes

    也要求线性时间,输入须有序。

下列算法要求对数据顺序无强制要求,但最好有序:

  • unique
  • unique_copy

STL 允许我们自己定义排序算法,为了让程序正确的运行,我们必须保证排序时候所用的比较算法和上述的算法中使用的比较算法相同,例如下面的例子中:

vector<int> v;
//... putting values to this vector. sort(v.begin(), v.end(), greater<int>); // Sorted in descending order. bool a4Exists =
binary_search(v.begin(), v.end(), 5); // Assumes vector sorted in ascending range

试图从降序排列的数据中按照升序算法去找一个数据,很有可能会出问题,而下面的表达式中,在 binary_search 中指定比较算法为排序算法中所使用的比较算法,则没有问题:

bool ret = binary_search(v.begin(), v.end(), 5, greater<int>());

下面是完成的测试代码:

#include <vector>
#include <algorithm>
#include <iostream> using namespace std; #define N 100 #define show(s,m) cout<< m ;if (s) { cout << " 5 exists!" << endl; } else { cout << " 5 not existed!" << endl; } int main(int argc, char *argv[])
{
srand(time(NULL));
vector<int> v(N);
for (int i = 0; i < N; ++i)
{
v[i] = i;
} random_shuffle(v.begin(), v.end()); sort(v.begin(), v.end(), greater<int>()); bool ret = binary_search(v.begin(), v.end(), 5);
show(ret, "Searching in different compare function:"); ret=binary_search(v.begin(), v.end(), 5, greater<int>());
show(ret, "Searching in same compare function:");
return 0;
}

下面是输出:

Welcome to the Emacs shell

~/Documents/MetaWebBlog/org $ ~/tmp $ ./test
Searching in different compare function:5 not existed!
Searching in same compare function:5 exists!

最新文章

  1. 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件
  2. WPF程序如何自定义启动窗口并传参
  3. win7 64位安装pygame
  4. 01分数规划zoj2676(最优比例,最小割集+二分)
  5. Eclipse项目和MyEclipse项目
  6. 将一个字符串映射为一个Delphi页面控件属性名(通过FindComponent和GetPropInfo找到这个控件指针)
  7. 【转】VC中对文件的读写
  8. 使用Java Applet在客户端解压缩,以及使用证书的意义
  9. mysql学习(八)数据表类型-字符集
  10. javascript操作JSON对象,增加 删除 修改
  11. cocos2d-x学习日志(10) --射击游戏(喵星战争)
  12. Windows下caffe的配置和调用caffe库(一)
  13. 使用domain模块捕获异步回调中的异常
  14. java多线程的(一)-之java线程的使用
  15. linux安装OpenCV以及windows安装numpy、cv2等python2.7模块
  16. 【原创】JAVA面试解析(有赞一面)
  17. thinkphp5省市区三级联动例子
  18. Android开发技术周报183学习记录
  19. hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)
  20. 单源最短路——Dijkstra模板

热门文章

  1. 基于Java visualvm的可视化监控的使用
  2. codeforces.com/contest/251/problem/C
  3. 三、Linux学习之命令基本格式篇
  4. Spring 手动提交事务
  5. js判断当前浏览器是pc端还是移动端
  6. Linux6.x修改出eth0网卡的解决方法
  7. python3使用stmplib发送邮件
  8. JS开启浏览器全屏模式,需要手动触发
  9. python json 访问与字符串截取
  10. HDU1693 Eat the Trees(zerojudge a228)