c++Primer笔记(11)

来源:互联网 发布:合肥百度快照优化 编辑:程序博客网 时间:2024/05/17 10:05
  

第11章:泛型算法。algorithm

1.标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上。

1.find(b,e,v);查找算法,根据迭代器b,e,找到了就返回指向元素的迭代器,没有找到就返回e实参表示失败。

2.count(b,e,v)可以统计v的次数哦。

关键概念:算法永不执行容器提供的操作(函数)

3.标准库还定义了一组泛化的算术算法:在numeric头文件中。

只读算法:

1.累计算法:accumulate(b,e,v)  ,把b到e的所有累加然后再加上v.  累加操作从原理上可以不需要第3个参数,但是在这个算法中第3个参数是必须的,因为这个累加泛型算法,他根本就不知道累加的类型是什么,他靠的就是第三个参数知道的,即你传个0,传个string("")都是可以的。

2.find_first_of (b1,e1,b2,e2); 这里标记了2段范围,在第一个范围内查找与第二个范围中任意匹配的元素,然后返回一个迭代器,指向第一个匹配的元素,找不到,返回end.

    这2对迭代器不必须是同一个类型,但是他们内部的元素类型必须兼容,例如:vector<char*>  list<string>, 

 

写容器元素的算法:

1.fill(b,e,0) ,表示所有元素都填充0值。   fill_n (b,n ,0): 表示给b开始,往后10个元素,都填充0值。这个必须确保有这么多个元素,否则未定义。越界了呗。

2.插入迭代器:vector<int> v1;  back_inserter(v1)  ; 这样,就返回一个表示可以插入的迭代器,我们可以通过fill_n()与之配合使用: //必须添加头文件:iterator

      fill_n ( back_inserter(v1)  , 10 , 0 )  ; 这样就表示在v1后面插入10个元素,初始值为0. 效果相当于 push_back()

3.copy(b,e,back_inserter(v1)) ;  表示将b-e的所有元素,都拷贝到v1中去,从back_inserter(v1)的返回值开始拷贝。 

4.replace(b,e,0 42); 把所有0值都替换成42. 哈哈

5.replace_copy(b,e, back_insert(v1) ,0,42) ; 把b-e中的东东都copy到v1,从back_insert(v1)开始copy,同时也会检测v1中所有为0的元素,都替换成42.

    这个算法呢:做了2步:1.把v1中所有的0都替换42 2.把b-e中的数据都copy了一份到v1中了。

 

对容器重新排序的算法: 

1. sort(b,e) ,通过<来排序。    stable_sort(b, e ,比较函数名) 按照该函数内部的比较方式进行比较。  page346.

2. unique (b,e)  该算法删除相邻的重复元素,然后重新排列了,返回一个迭代器表示无重复的值范围的结束。 

例子:  sort( v1.begin() , v1.end() ) ;   vector<string>::iterator end_unique = unique(v1.begin() , b1.end() );  v1.erase( end_unique, v1.end());//删除之后重复的元素。

unique没有删除元素,只是将无重复的元素赋值到序列的前端了,从而覆盖了相邻的重复元素。

注解:算法不直接修改容器,需要添加和删除必须使用容器操作函数。

 

再谈迭代器:page 346 我已经不想再谈了,以后再慢慢看吧。这里跳过了。

1.插入迭代器

2.反响迭代器

3.iostream迭代器