一:泛型算法 简介
(1)所有标准库容器都有支持递增运算符、递减运算符(++、--、== !=)这四种运算符的迭代器;string 和 vector 提供了更多的运算符(> >= < <=,以及iter+n,iter-n,iter+=n,iter-=n,iter1-iter2)
(2)标准库并未给每一个容器都定义成员函数来实现排序、查找、复制等操作,而是定义了一组泛型算法(generic algorithm)。
(3)迭代器令算法不依赖于容器
(迭代器的知识请看 : 初始迭代器 iterator)http://blog.csdn.net/u010700335/article/details/41516159
例如 find()函数流程中,除了比较之外,其它的步骤都可以通过迭代器来实现:利用迭代器的解运算符可以实现元素的访问(*) ++ 移动到下一个元素,尾后迭代器可以用来判断find是否到达给定序列的末尾。
(4)算法永远不会执行容器的操作
只会运于与迭代器之上,执行迭代器的操作,算法仅仅可能改变容器中保存的元素的值,也可能在容器内移动元素,但是永远不会直接的添加或者删除元素。
(5)算法不检查写操作:
fill(vec.begin(),vec.end(),0); 没有任何问题的,但是fill_n(vec.begin(),10,0)就有危险了,你能否保证vec.size()是否大于10?再如拷贝算法(copy),此算法是另一个向目的位置迭代器指向的输出序列中的元素,共三个迭代器做参数,也得保证目的数组足够的大,否则报错误的:
int a1[] = {0,1,2,3}; int a2[sizeof(a1)/sizeof(a1[0])]; auto ret = copy(begin(a1),end(a1),a2).
(6)重排容器的算法unique()
words 是一个字符串数组 sort(words.begin(),words.end()); auto end_unique = unique(words.begin(),words.end()); words.erase(end_unique,words.end());
(7)定制操作
很多算法都会比较输入序列中的元素,默认情况下这类算法使用元素类型的 < 或 == 运算符完成比较。标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认的运算符。
例如,sort函数的第二个版本,此版本是重载过的,他接受第三个参数,这个参数 名称叫 谓词(predicate):sort(words.begin(),words.end(),cmp);cmp是二元谓词。谓词分为一元谓词和二元谓词,而谓词是一个可调用的表达式,其返回结果是一个能用作条件的值,如:
sort(words.begin(),words.end(),isShorter); bool isShorter(const string &s1,const string &s2); { return s1.size() < s2.size();// 这里仍然遵循 默认情况下这类算法使用元素类型的 < 或 == 运算符完成比较 这条原则。 }
二:算法一般都含有两个版本的
(1)请看primer 上提供的sort() 、 stable_sort()、partion_sort()、partion_sort_copy() 等排序算法
(2)请看primer 上提供的lower_bound() 、 uuper_bound()、binary_search()等三个基于二分思想的查找算法
实现简单的代码请看 : (二分查找三种算法)http://blog.csdn.net/u010700335/article/details/41323427