最近学习了c++primer中的第11章的泛型算法,这一章的基础是c++中的容器,但是泛型算法是独立于特定的容器的,这样的算法不会改变容器的大小,这样保证了不管是哪种类型的容器都可以同时调用同一种算法来实现操作。
首先介绍下这些常用的算法的头文件,比较常用的是algorithm,numeric和iterator,最先遇到的函数是find()函数,需要三个参数,前两个是一般的算法函数都需要的,是一对相同类型的迭代器,这两个迭代器规定了操作的范围,常称为输入范围,而第三个参数是所需要查找的元素;第二个函数是accumulate(),这个函数也需要三个参数,前两个参数也是输入范围,第三个参数给定了累加的初始值;书中还介绍了很多其他的函数,例如count_if函数,unique函数,replace_copy函数等等。
学习这些函数我们要谨记的是这些函数都是泛型算法,函数本身不会改变容器的大小,不会删除或者添加元素,函数是独立于特定的容器的,掌握这些函数的一些基本特征,便于记忆。
然后就是既然这些泛型算法的函数不能改变容器的大小,不能删除和添加元素,那么问题来了,加入我们要实现这样的操作怎么办呢?第一种办法是调用容器的成员函数实现这样的功能,或者使用迭代器适配器,也就是迭代器插入器实现这样的操作,插入器分为三种1. back_inserter 2. front_inserter 3. inserter 这三种迭代器插入器的使用是不一样的,back_inserter是利用了在操纵迭代器时调用了容器的push_back成员函数实现元素的插入,同样另外两个也是在操作迭代器时调用了相应的容器的成员函数;
最后学习了流迭代器和反向迭代器,虽然流不是容器,但是标准库中也定义了输入输出流的迭代器,将流和迭代器绑定在一起实现数据的输入输出,记住我们只能从输入流中读取数据和忘输出流中写入数据。
下面以一段代码结束这篇博客:
#include <iostream> #include <vector> #include <list> #include <algorithm> using namespace std; bool is2(int); void main() { int ia[10]={1,5,2,8,2,3,5,2,9,3}; vector<int> vec(ia,ia+10); //find the element of 2, and count how many there are vector<int>::size_type count=0; vector<int>::iterator ite=vec.begin(); while((ite=find(ite,vec.end(),2))!=vec.end()) { ite++; count++; } cout<<count<<endl; //using count_if to count the quantity of 2 vector<int>::size_type count1=count_if(vec.begin(),vec.end(),is2); cout<<count1<<endl; ostream_iterator<int> out_ite(cout," "); copy(vec.begin(),vec.end(),out_ite); cout<<endl; sort(vec.begin(),vec.end()); copy(vec.begin(),vec.end(),out_ite);cout<<endl; vector<int>::iterator end_iter=unique(vec.begin(),vec.end()); copy(vec.begin(),vec.end(),out_ite); cout<<endl; vec.erase(end_iter,vec.end()); copy(vec.begin(),vec.end(),out_ite); vec.clear(); istream_iterator<int> in_iter(cin),eof; while(in_iter!=eof) vec.push_back(*in_iter++); } bool is2(int x) { return x==2; }
坚持c++学习,真正掌握c++(3)