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!

Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据的更多相关文章

  1. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  2. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  3. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  4. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  5. Effective STL 学习笔记 Item 17: Swap Trick

    假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...

  6. Effective STL 学习笔记 Item 16:vector, string & C API

    有时需要支持 C 的接口,但这并不复杂. 对于 vector 来讲, \(v[0]\) 的地址 \(\&v[0]\) 即可作为数组指针传递给 C API: 1: // Legacy C API ...

  7. Effective STL 学习笔记 Item 18: 慎用 vector<bool>

    vector<bool> 看起来像是一个存放布尔变量的容器,但是其实本身其实并不是一个容器,它里面存放的对象也不是布尔变量,这一点在 GCC 源码中 vector<bool> ...

  8. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  9. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. select标签和多行文本标签

    一.多行文本textarea <form> <div> <textarea name="more"></textarea> < ...

  2. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  3. android studio run得时候 选择开启对话框

    一个项目run 调试得时候,在Android studio3.0默认得设置是运行在上一个device上,我们通过改变设置,废话不多说,上图: 然后点击这个edit config 在miscellane ...

  4. Windows服务的安装和卸载

    ## install %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ***Cache.WinService.exe # ...

  5. 【51nod】1766 树上的最远点对

    [题意]给定n个点的树,m次求[a,b]和[c,d]中各选出一个点的最大距离.abcd是标号区间,n,m<=10^5 [算法]LCA+树的直径理论+线段树 [题解] 树的直径性质:距离树上任意点 ...

  6. HDU 1069 Monkey and Banana(最长递减子序列)

    题目链接 题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高. 题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一 ...

  7. 初时Python博大精深

    Python是解释型语言 编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行.缺点:编 ...

  8. js之事件冒泡和事件捕获及其阻止详细介绍

    虽然精通jquery,但对它的原型javascript却不是很了解,最近在学习javascript中遇到了一些困难,比如冒泡和捕获,很多次被提到,但又不知究竟应用在何处.找到了一些好文章解惑,在这里分 ...

  9. no libsigar-amd64-linux.so in java.library.path 解决方法

    关于sigar的介绍可以参考这边博文 :https://www.cnblogs.com/luoruiyuan/p/5603771.html 在Linux上运行java程序时出现 no libsigar ...

  10. The Art of Memory Forensics-Windows取证(Virut样本取证)

    1.前言 The Art of Memory Forensics真是一本很棒的书籍,其中使用volatility对内存进行分析的描述可以辅助我们对更高级类的木马进行分析和取证,这里对书中的命令进行了笔 ...