Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
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!
(转载请注明出处,使用许可:署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 。)
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据的更多相关文章
- 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 ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- 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 ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- Effective STL 学习笔记 Item 17: Swap Trick
假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...
- Effective STL 学习笔记 Item 16:vector, string & C API
有时需要支持 C 的接口,但这并不复杂. 对于 vector 来讲, \(v[0]\) 的地址 \(\&v[0]\) 即可作为数组指针传递给 C API: 1: // Legacy C API ...
- Effective STL 学习笔记 Item 18: 慎用 vector<bool>
vector<bool> 看起来像是一个存放布尔变量的容器,但是其实本身其实并不是一个容器,它里面存放的对象也不是布尔变量,这一点在 GCC 源码中 vector<bool> ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- 布隆过滤器 Bloom Filter
使用普通集合来判断一个元素是否已存在于集合中,需要占用比较大的空间.而使用Bloom Filter 可有效节省空间. Bloom Filter 以较少的内存占用及较小的误判率达到判断元素是否存已经加入 ...
- 利用Snapshot快速跨Region迁移服务器
当你需要对现有的网站进行跨区域迁移,或者是部署DR Site的时候,又不希望重新部署应用,有什么好办法呢?其实你可以利用Azure的磁盘snapshot进行磁盘级的复制,这样可以减少很多部署应用的时间 ...
- Dockerfile 部署 nodejs
1.编写.dockerignore 构建镜像时,并不需要node_modules目录等内容,可以使用.dockerignore忽略一些文件 # .dockerignore Dockerfile nod ...
- django中django.conf.urls.url函数
在urls.py文件中,我们经常会看到类似于这样的代码: urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_arc ...
- P1978 集合
P1978 集合 题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性 ...
- 科学计算三维可视化---TVTK入门(数据加载)
一:数据加载 大多数可视化应用的数据并非是在TVTK库中构建的,很多都是通过接口读取外部数据文件 (一)使用vtkSTLReader来读取外部文件 .stl 文件是在计算机图形应用系统中,用于表示三角 ...
- MySQL完整复制表到另一个新表
1. 复制表结构 CREATE TABLE newuser LIKE user; 2. 导入数据 INSERT INTO newauser SELECT * FROM user;
- dubbo Filter
官方说明: 调用拦截扩展 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响. 约定: 用户自定义 fi ...
- [转载]IIS6.0开启WOFF/SVG文件支持
http://www.bao21.com/120.html http://stackoverflow.com/questions/18369036/bootstrap-3-glyphicons-not ...
- Linux/Unix 下自制番茄钟
习惯使用番茄工作法,在Linux上工作时也需要一个番茄钟. 安装一个Linux下番茄钟工作软件? 其实根本没必要,我们可以用Linux下经典的at命令实现一个简单的番茄钟. 安装AT 一般Linux基 ...