zoukankan      html  css  js  c++  java
  • 《C++STL基础及应用》读书笔记

    1、五种迭代器。

    输入迭代器重载 *、== 、!= 、前置++、后置++运算符。STL提供的主要输入迭代器是 istream_iterator 。

    它有两种构造函数:

    istream_iterator() :创建一个流结束的迭代器

    istream_iterator(istream& ):参数是输入流,含义是从输入流中读数据,当遇到流结束符时停止。

      #include <iostream>
      #include <iterator>
    
      using namespace std;
      int main()
      {
          cout<<"Please Input(int): "<<endl;
          istream_iterator<int> a(cin);
          istream_iterator<int> b;
          while(1)
          {
              cout<<*a<<endl;
              a++;
              if(a == b)
              {
                  cout<<"break"<<endl;
                  break;
              }
          }
      }


    输出迭代器:

    输出迭代器重载 *、=、前置++、后置++运算符。STL提供的主要输入迭代器是 ostream_iterator 。

    它有两种构造函数:

    ostream_iterator(ostream& ) :创建一个流输出迭代器,用来迭代out输出流。

    ostream_iterator(ostream& ,const char* delim):同上,只是输出的数据之间用 delim 字符串分隔。

      #include <iostream>
      #include <iterator>
    
      using namespace std;
      int main()
      {
          ostream_iterator<int> ostream_it(cout,"\t");
          for(int i = 0;i < 5; i++)
          {
              *ostream_it = i;
              ostream_it++;
          }
          return 0;
      }

    前向迭代器:包含了输入和输出迭代器两者的所有功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读写。顾名思义,前向迭代器只能向前移动,但是STL本身并没有为专为前向迭代器预定义的迭代器。

    双向迭代器:包含了前向迭代器的所有功能,另外它还可以利用自减操作符向后移动一个位置。例如 list 容器需要的就是双向迭代器。

    随机访问迭代器:具有双向迭代器的所有功能,再加上一个指针所有的功能。包括使用操作符operate[]进行索引,加某个整数值到一个指针就可以向前或向后移动若干位置,或者使用比较运算符在迭代器之间进行比较。比如 vector 容器需要的就是该类迭代器。

    在一切情况下,都可以使用需求最细的随机访问迭代器,但过多的需求会降低它的效率。所以实际编程时应该选择正好合适的iterator以期得到最高的效率。

    文件读写:无论读写,文件不存在时都不会报异常。如果文件不存在,读时数据为空,写时创建新文件。

    文件读取:

      #include <iostream>
      #include <fstream>
    
      using namespace std;
      int main()
      {
          //write file:
          string filename = "hello.cpp";
          ofstream fout;
          fout.open(filename.c_str());
          //ofstream fout(filename.c_str(),ios::app);  //使用构造函数,可以判断文件是否存在。如果用构造函数还是open(),文件不存在时,都可以自动创建。
          //if(!fout)
          //{
          //  cout<<"file not found!create a new file."<<endl;
          //}
          fout<<"Key"<<"\t"<<"Value"<<endl;
    fout.close();
    //read file: ifstream fin(filename.c_str()); string str; while(getline(fin,str)) //按行读取(以\n为间隔符)。也可以 while(fin>>str) 这是以空格间隔符读取
        { cout
    <<str<<endl; }
        fin.close();
    return 0; }

     二进制文件读写:

      #include <iostream>
      #include <fstream>
    
      using namespace std;
    
      struct User
      {
          int id;
          char name[20];
      };
      int main()
      {
          User user1={1,"yugd"};
          User user2;
          string filename = "test.dfd";
          ofstream ofs(filename.c_str());
          ofs.write((const char*)&user1,sizeof(User));
          ofs.close();
    
          ifstream ifs(filename.c_str());
          ifs.read((char*)&user2,sizeof(User));
          cout<<"id: "<<user2.id<<"\tname: "<<user2.name<<endl;
          ifs.close();
          return 0;
      }

    输入输出流缓冲:

      #include <iostream>
      #include <fstream>
    
      using namespace std;
    
      int main()
      {
          string filename = "test.cpp";
          ifstream ifs(filename.c_str());
          cout<<ifs.rdbuf();
    ifs.close();
    return 0; }


    定位输入输出流:

    函数对象:

    必须重载 operator() 函数,函数对象调用方式为直接采用构造函数形式。

      #include <iostream>
      #include <vector>
    
      using namespace std;
    
      int sum = 0;
      void f(int n)
      {
          sum += n;
      }
    
      class SumClass
      {
      public:
          SumClass():sum(0){}
          void operator()(int n)
          {
              sum += n;
          }
          int getSum(){return sum;}
      private:
          int sum;
      };
    
      template <typename T> class TSumClass
      {
      public:
          TSumClass():sum(0){}
          void operator()(T n)
          {
              sum += n;
          }
          T getSum(){return sum;}
      private:
          T sum;
      };
    
      int main()
      {
          vector<int> vect;
          for(int i= 1;i<= 100;i++)
              vect.push_back(i);
          for_each(vect.begin(),vect.end(),f);
          cout<<"sum: "<<sum<<endl;  //5050
          SumClass obj = for_each(vect.begin(),vect.end(),SumClass());   //直接采用构造函数形式调用。
          cout<<"obj.getSum(): "<<obj.getSum()<<endl;   //5050
          TSumClass<int> tobj = for_each(vect.begin(),vect.end(),TSumClass<int>());
          cout<<"tobj.getSum(): "<<tobj.getSum()<<endl;  //5050
      }

    merge():合并两个排序列表;
    splice():拼接两个列表;
    sort():列表的排序;

      #include <list>
      #include <iostream>
    
      int main()
      {
          int array1[4] = {1,5,3,10};
          int array2[4] = {2,8,6,9};
          std::list<int> lt1(array1,array1+4),lt2(array2,array2+4);
          lt1.sort();
          lt2.sort();
          //lt1.splice(lt1.begin(),lt2);   //2,6,8,9,1,3,5,10
          lt1.merge(lt2); //1,2,3,5,6,8,9,10
     }

    queue(队列,先进先出)与stack(栈,后进先出)的构造函数:

    queue(class T,class Container = deque<T>);

    stack(class T,class Container = deque<T>);

    其默认容器都是deque.

    priority_queue 默认容器是 vector.

    队列独有的函数:T& front();    T& back();

    堆栈独有的函数:T& top();   返回栈顶元素,其实类似于 back();

    容器适配器只是基础容器类的再封装,不是重新定义。

    queue 可以使用 deque  和 list 做为基础容器(vector 没有 pop_front 方法), stack 可以使用 deque、 list 和 vector 做为基础容器。

    再谈迭代器:

    非变异算法列表:

    变异算法列表:

    排序及相关函数列表:

  • 相关阅读:
    BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)
    后缀自动机详解!
    BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机 多串)
    BZOJ 3938 Robot
    [JSOI2008]Blue Mary开公司
    [ZJOI2017]树状数组
    [JSOI2015]非诚勿扰
    [HNOI2011]任务调度
    BZOJ 3680 吊打XXX
    POJ 3318 Matrix Multiplication
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/2706075.html
Copyright © 2011-2022 走看看