《C++ Primer》十一章泛型算法笔记(一)

一、只读算法

1. 泛型算法必须包含头文件  #include<algorithm>

   list<int>::const_iterator result =  fine(v.begin(),  v.end(), m); //在容器v中查找34,返回指向m的迭代器.为只读算法

2.  int sum = accumulate(v.begin(), v.end(), 34);//在区间内相加,34为累加的初值。返回一个和。第三个参数必须,且通过它函数才知道要相加的是啥类型,

   #include <numeric> 头文件必加

   vector<string> v;
   v.push_back("aaaaaa");
   v.push_back("dddddd");
   v.push_back("cccccc");
   v.push_back("vvvvvv");
  string He = accumulate(v.begin(), v.end(), string(" "));//当第三个参数是” “是错误的这样的话是说累加的类型是const char*的,所以要显示的创建空字符串string(” “)
  cout<<"He  = "<<He<<endl;

/////////////////////////

vector<double> v3;
v3.push_back(2.222);
v3.push_back(4.444);
v3.push_back(1.111);
double D = accumulate(v3.begin(), v3.end(),0.0);
cout<< "D  = "<<D<<endl;                 //结果是 7.777

vector<double> v3;
v3.push_back(2.222);
v3.push_back(4.444);
v3.push_back(1.111);
double D = accumulate(v3.begin(), v3.end(),0);
cout<< "D  = "<<D<<endl;            //结果是 7

3. it = find_first_of(v1.begin(), v1.end(), v2.begin(), v2.end());//两个容器范围,在v1中查找与v2中任意元素匹配的元素。返回一个迭代器,指向第一个匹配的元素,v1和v2可以使不同的类型只要可以使用(==)就可以

4.cout<<"IT  = "<<(*it)<<endl;  当it指向最后一个就是v.end()时会出现段错误。

二、写容器元素算法(本质上是安全的,但是他不检查空间是否够用,可能会导致程序崩溃)

1.  fill(v.begin(), v.end(), 0);  用0代替v的所有元素v内的类型要和第三个参数匹配

2.  fill_n(v.begin(), 10, 0);//一定要保证容器内存在10个元素。否则会崩毁

3. #include<iterator>  插入迭代器back_inserter(一个容器的引用v),返回一个绑定在v的迭代器

   vector<int> vec; //空的
   fill_n(back_inserter(vec), 10, 1);
   for (vector<int>::iterator iter1 = vec.begin(); iter1 != vec.end(); iter1++ )
    {
      cout<<"iter1 = "<<(*iter1)<<endl;      //输出时十个 1 ; back_inserter相当于push_back
   }

4.  copy(v.begin(),v.end(),back_inserter(vec));//vec为空的容器 把v的内容复制到vec中。容器可以不一样(v可以是vector 但是vec可以是list,但是存储的类型一定要一样)

5. 去除容器内的重复元素

    sort(v.begin(), v.end());  //v容器的元素排序,重复的就都在一起了

    vector<string>::iterator end_unique = unique(v.begin(), v.end());  //把不重复的放到一起,重复的单跳出来放到最后,返回最后一个不重复元素的写一个。

    unique_copy(v.begin(),v.end(),vec);//将v中不重复的数据拷贝到vec中。

    v.erase(end_unique, v.end()); //删除返回放的都是v重复单词的容器内容。在吧最后的值赋给v。算法不能直接更改容器的大小,如果需要添加或者删除元素,则必须使用容器操作。

6. 统计长度不小于6的单词个数(如下)

7. 排序算法

     a.  sort(v.begin(),v.end());//使之按字典顺序排序

     b.  bool isShorter(const string &s1, const string &s2){return s1.size() < s2.size();}//这个函数叫做为此函数,都是bool类型的,就写在你要用的前面,

         stable_sort(v.begin(),v.end(),isShorter);//对容器按单词长短排序*之后相同长度的元素*按照字典顺序在排序

     c. bool GT6(const string &s){return s.size()>= 6;}//谓词函数

         vector<string>::size_type wc6 = count_if(words.begin(),words.end(), GT6); //开始结束范围内的单词传给GT6来判断,count_if判断容器内有几个符合条件的单词

三、

1. 标准库所定义的迭代器不依赖于特定的容器。

     a. 插入迭代器::这类迭代器与容器绑定在一起,实现容器插入元素

         back_inserter、front_inserter(需要使用push_front,它会反向添加元素)、inserter(v要插入的容器, 迭代器it位置前面)

         list<int> ilst;                              
         ilst.push_back(156);
         ilst.push_back(15);
         ilst.push_back(16);              //ilst的元素是156 15 16
         list<int> lst;
         lst.push_back(1);
         lst.push_back(2);
         lst.push_back(3);
         lst.push_back(4);               //lst的元素师 1 2 3 4
         list<int>::iterator itf = find(ilst.begin(), ilst.end(), 15);  //在ilst中找到 15 坐在的位置
         replace_copy(lst.begin(), lst.end(),inserter(ilst, itf), 4, 0); //lst的全部元素复制到ilst中itf所指的元素前面,并且把4替换成0.  结果是:156 1 2 3 0 15 16

     b. iostream 流迭代器 :可与输入输出流绑定在一起,用于迭代遍历所关的IO流。 istream_iterator读取输入、ostream_iterator写输出流,流迭代器只定义了最基本的迭代操作自增、解引用(返回从流中读取的值)和赋值,可以比肩两个istream迭代器是否相等,但是ostream不能提供 

        vector<int> vecf;
        istream_iterator<int> in_iter(cin);
//读取int类型
        istream_iterator<int> eof;
//定义为空的
        while (in_iter != eof)
            vecf.push_back(*in_iter++);//
int保存到vec中*in_iter++ 相当于*(in_iter++);先赋值后++  所以后置++要备份          

     /////////////////////////////////////////////////////////////////////////////////////

       ostream_iterator<string> out_iter(cout,"\n");
       istream_iterator<string> in_iter2(cin), eof2;

        while(in_iter2 != eof2)
       {   *out_iter++ = *in_iter2++;}// 
把当前的读入的内容给输出后++ 在后面 赋完值之后++ ;要给加1输入解引用赋值完事之后才执行 = 
                                                    //输出上次循环赋给的值,会输出解引用加1

     c. 反向迭代器:这类迭代器是从前向后遍历这里;“++”访问前一个元素“--”访问的是下一个元素与正常的正好相反,所有的类型容器都有自己的reverse_iterator类型

        rbegin() 容器的为元素

        rend()  容器的首元素的前一位

        sort(v.begin(), v.end())升序和   sort(v.rbegin(), rend())降序

        使用反向迭代器是以逆序从后向前处理string对象的

    d. const迭代器 不希望修改容器中的元素

你可能感兴趣的:(C++,算法,String,vector,list,iterator)