c++Primer,十一,泛型算法

来源:互联网 发布:java输入字符串语句 编辑:程序博客网 时间:2024/05/01 21:35

第十一章 泛型算法

     在前面学习完容器和迭代器之后,发现容器提供的操作并不是很多,当然也够用了。标准库容器定义的操作非常少。标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上。

  泛型算法:因为它们实现共同的操作,所以称之为“算法”;而“泛型”指的是它们可以操作在多种容器类型上——不但可作用于 vector 或 list 这些标准库类型,还可用在内置数组类型、甚至其他类型的序列上。这里说泛型算法,大多数是和容器相关的,所以应该说是我们平常说的算法(像八皇后算法,深度优先算法。。)的特殊用子集。。。。

举个例子好了:

vector<int> vec;

int search_value = 42;
vector<int>::const_iterator result =find(vec.begin(), vec.end(), search_value);
cout<<*result;

甚至可以作用到数组上:

int ia[6] = {27, 210, 12, 47, 109, 83};

int search_value = 83;

int *result = find(ia, ia + 6, search_value);
//****************************************************************************************

每个泛型算法的实现都独立于单独的容器。这些算法还是大而不全的,并且不依赖于容器存储的元素类型。算法是基于迭代器及其操作实现的,而不是基于容器操作,,所以说,算法约束:我们要知道所操纵的范围,用迭代器指出,迭代器的++可以访问下一个元素。。。算法不直接添加或删除元素,即,算法不改变原容器大小,最多改变值或者改变顺序。

初窥算法:理解算法的最基本方法是了解该算法是否读元素、写元素或者对元素进行重新排序。以下是书本中介绍的内容,具体使用实例,就不罗列了。

只读算法:find.....

写元素算法:fill,fill_n,copy.......

重新排序算法:sort,unique...

着重说下unique,它的功能是去除重复项,假设原数据元素是{3,6,4,8,3,4},使用unique算法后,数据内容变为{3,6,4,8,3,4},并返回指向8后面的3的一个迭代器(无重复序列末尾的下一个位置),然后可以使用容器自带的删除元素操作,来删除后面的数据{3,4},就完成了删除重复项的工作。

另外还可以自定义使用函数,就是让算法按照自己的比较方式来判断是否满足条件,本章关于这点还引出了函数类的概念,后面想学多点的话,可以了解下。

再谈迭代器:前面强调标准库所定义的迭代器不依赖于特定的容器。事实上,C++ 语言还提供了另外三种迭代器:插入迭代器,iostream迭代器,反向迭代器。这些等用到了再看吧。。。实在是烦。。。

注:尽管 map 和 set 类型提供双向迭代器,但关联容器只能使用算法的一个子集。问题在于:关联容器的键是 const 对象。因此,关联容器不能使用任何写序列元素的算法。只能使用与关联容器绑在一起的迭代器来提供用于读操作的实参。

额,大概算法就是拿来用的吧,如果想深究,看源码吧。。不过这里想起来上次疑惑的迭代器失效问题,是不是可以这么安慰自己:容器的元素可以用迭代器指向它,通过迭代器来得到,如果容器的内存是连续的,自然可以++来遍历,如果不是的呢,那么是不是可以重载++,设法使它可以得到下个元素的地址,这样对外表现就很自然了,当迭代器指向的数据被删除时,这个元素没有了,于是得不到它的下个地址了,所以失效了。。。这都是杜撰。。懒人就是这样,想当然,不知道去分析源码。。。唉,怎么能长进。。。另外值得一提的是,算法是类似于c语言的函数式编程方式,不是面向对象的编程方式,也就是说,到目前位置,我们一直是在讨论better C,而不是 C with class好了,下面会学习类,一种自定义类型,用来丰富c语言的数据类型,进而实现面向对象的程序设计技术。



0 0
原创粉丝点击