第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迭代器