泛型算法 —— 独立于容器的算法

一:泛型算法 简介

(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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。