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

一:泛型算法 简介

(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

时间: 2024-10-12 18:24:25

泛型算法 —— 独立于容器的算法的相关文章

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<

C++ Primer笔记 容器和算法(1)

C++ 容器和算法(1) "泛型算法": 1.      算法可以作用于不同的容器类型. 2.      容器容纳多种不同类型元素 顺序容器: vector list deque(全称double-ended queue) 适配器: stack queue priority_queue 定义: vector<string> svere; C c(b,e)当[b,e) 左开右闭之间的元素. C c(n,d)初始化n个d 复制构造  vector<int> ivec

c++第十八章-(容器和算法)

容器和算法 容器: 容器的概念:能容纳两个或更多个值的数据结构,通常我们称为容器(container). 这么说,数组是唯一直接支持的容器,但数组并不适合用来解决所有的问题. 上一节利用模板就实现了一种新的容器(栈Stack). 老一辈程序员为我们提供了一种容器库,Standard Template Library.STL库. 算法: 数组大小固定的,后来引入了一种新的数据类型,vector向量, 声明:std::vector<type> vectorName; #include <ve

《STL源码剖析》——第五、六:关联容器与算法

第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层机制均以RB-tree(红黑树)完成.RB-tree也是一个独立容器,但并不开放给外界使用. SGISTL还提供了一个不在标准规格之列的关联式容器:hash_table (散列表),以及以此hash_table为底层机制而完成的hash_set(散列集合).hash_map(散列映射表).hash_

非阻塞算法在并发容器中的实现【转】

转自:https://www.ibm.com/developerworks/cn/java/j-lo-concurrent/ 非阻塞算法在 Java 中的应用越来越广泛 , ConcurrentLinkedQueue 是 java. concurrent 包中基于非阻塞算法实现的并发容器的典范.通过本文,您将了解非阻塞算法的工作原理及其在 ConcurrentLinkedQueue 中的具体实现机制. 简介 非阻塞算法在更细粒度的层面协调争用,它比传统的锁有更高的并发性.随着非阻塞算法在 Jav

C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)

总所周知,C++ STL中有个头文件,名为algorithm,即算法的意思. The header<algorithm>defines a collection of functions especially designed to be used on ranges of elements. 所以,要八一八这个头文件中C++11新增的几个算法,今天主要描述的几个算法不改变容器中元素的顺序. 这里还要啰嗦一句,使用stl算法时,如果与lambda表达式组合使用,那么代码会更加简洁. find_

C++标准模板库STL算法与自适应容器(栈和队列)

参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在顺序容器的基础上按照stack.queue的性质进行定制实现的.所以,本篇博文将言简意赅地总结出需要掌握的纲要. 一.STL算法 查找.搜索.删除.计数.排序等都是一些通用算法,STL通过模板函数提供了这些算法,可通过迭代器对容器进行操作.需要包含<algorithm>头文件. 1. find,f

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

【数据分析/挖掘底层算法】原创实现二项分布算法以及应用

7.2 二项分布算法 作者 白宁超 2015年8月15日22:51:38 摘要:本文继统计学几何分布.二项分布.泊松分布研究的深入,基于各种分布基础概念和核心知识介绍之后.就各种分布的实现和真实环境下应用方是目的.在进行一系列相互独立实验,每次既有成功,又有失败的可能,且单次实验成功概率相等.在一系列试验中求成功的次数.这种情况下适用于本算法.本算法中在n次伯努利试验中:试验n次得到r次成功的概率.二项分布的期望.二项分布方差的具体实现. 目录 统计学之离散概率分布的运用 统计学之几何分布.二项