Chapter16 string类和标准模板库

string类

  • string的构造函数:

    • string( const char *s )
    • string( size_type n, char c)

      创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c

    • string( const string &str)
    • string( )
    • string( const char*s, size_type n)
    • template string( Iter begin, Iter end)

        string six( alls+6, alls+10);
      

      即从字符串6-9四个数,不包括alls[10]

    • string( const string &str, string size_type pos=0, size_type n=npos )

        string eight( four, 7, 16)
      

      从four的第8个字符,位置为7开始,将16个字符复制到eight中

  • string对象,有两种输入方式:

    • cin » stuff;
    • getline( cin, stuff );

    C-风格字符串,有三种输入方式:

    • cin » info;
    • cin.getline( info, 100);
    • cin.get( info, 100);

    getline可指定哪个字符为输入边界:

    • cin.getline( info, 100, ‘:’ ); //读取直到:,丢弃:
    • getline( stuff, ‘:’ );
  • size()和length()成员函数都返回字符串中的字符数,而length()来自较早版本的string类,size()则是为提供STL兼容性而添加的

  • find()在字符串中搜索给定的子字符串或字符

    • size_type find(const sring &str, size_type pos=0) //返回子字符串首次出现时,其首字符的索引;否则,返回string::npos
    • size_type find(const char *s, size_type pos=0) //返回子字符串首次出现时,其首字符的索引
    • size_type find(const char *s, size_type pos=0, size_type n) //返回子字符串首次出现时,其首字符的索引
    • size_type find(char ch, size_type pos=0) //返回该字符首次出现的位置

    string库还提供了相关方法,rfing(),find_first_of(),find_last_of()和find_first_not_of()

  • c_str()将用string对象返回指向C字符串的指针

智能指针模板类

  • 智能指针是行为类似于指针的类对象,但这种对象还有其他功能

    • auto_ptr
    • unique_ptr
    • shared_ptr

    auto_ptr已经不常使用了,unique_ptrshared_ptr最常使用

    可将new获得的地址赋给这种类似指针的对象。当智能指针过期时,其析构函数将使用delete来释放内存,即内存自动被释放

      void demol()
      {
          double *pd = new double;
          *pd=25.5;
          return;
      }
    

    pd变量被释放,但是pd所指向的内存地址,没有被释放

      void demol()
      {
         auto_ptr<double> ap(new double);
         *ap=25.5;
         return;
      }
    
  • 要创建智能指针对象,必须包含头文件memery,该文件模板定义,然后使用通常的模板语法来实话所需类型的指针

      #include<memory>
      auto_ptr<string> ps (new string("test"));
    
  • throw()表示函数不会引起异常,所以在使用的时候,不必通过try/catch处理

  • 由于智能指针模板类的定义方式,智能指针对象的很多方面都类似于常规指针。

  • 当两个智能指针指向同一个string对象时,必须处理,否则程序将试图删除同一个对象两次:

    • 定义复制运算符
    • auto_ptr和unique_ptr,通过所有权ownership,对于特定对象,只能有一个智能指针可拥有
    • shared_ptr,跟踪引用特定对象的智能指针数,即引用计数

    另外:

    • 使用new分配内存时,才能使用auto_ptr和shared_ptr;
    • 使用new[]分配内存时,不能使用auto_ptr和shared_ptr;
    • 不使用new分配内存时,不能使用auto_ptr和shared_ptr;
    • 不使用new或new[]分配内存时,不能使用unique_ptr;
    • 即auto_prt只有new;unique_prt有new和new[];shared_ptr只有new
  • 选择智能指针:

    • 要使用多个指向同一个对象的指针,选shared_ptr:指针数组,使用辅助指针来标识特定元素;两个对象包含都指向第三个对象的指针;STL容器包含指针
    • 程序不需要多个指向同一个对象的指针,可使用unique_ptr:如果函数使用new分配内存,并返回指向该内存的指针;

标准模板库

  • STL(Standard Template Library)提供了一组表示容器、迭代器、函数对象和算法的模板。

    容器是与数组类似的单元,可以存储若干值:

    • STL容器是同质的,储存的值类型相同
    • 算法是完成特定任务
    • 迭代器能够用来遍历容器的对象,与遍历数组的指针类似,是广义指针
    • 函数对象是类似与函数的对象,可以是类对象或函数指针
  • vector:vector模板使用动态内存分配,可用初始化参数来指出需要多少矢量

          cin >> n;
          vector<double> scores(n);
    
  • STL容器基本方法:

    • size() 返回容器中元素数目
    • swap() 交换两个容器的内容
    • begin() 返回一个指向容器中第一个元素的迭代器
    • end() 返回一个表示超过容器尾的迭代器,标识超过结尾的位置

    迭代器是一个广义指针,其也可以是一个可对其执行类似指针的操作的对象。通过将指针广义化为迭代器,让STL能够为各种不同的容器类提供统一的接口。每个容器类都定义了一个合适的迭代器,迭代器的类型是名为iterator的typedef,作用域为整个类。声明迭代器:

          vector<double>::iterator pd;
    
    • push_back()将元素添加到矢量末尾
    • erase()删除矢量中给定区间的元素,接受两个迭代器参数,第一个迭代器指向区间的起始处,第二个位于区间终止处的后一个位置
    • insert插入区间元素,接受三个迭代器参数,第一个参数指定了新元素插入位置,第二个和第三个迭代器参数定义了被插入区间
    • for_each(),接受3个参数,前两个是容器中区间的迭代器,最后一个是指向函数的指针(函数对象)

           for_each(books.begin(), books.end(), ShowReview)
      
    • random_shuffle()函数接受2个指定区间的迭代器参数,并随机排列该区间中的元素

           random_shuffle( books.begin(), books.end() );
      
    • sort()函数将容器中的类型元素升序排列

           sort(books.begin(), books.end() );
           sort(books.begin(), books.end(), WorseThan );
      

泛型编程

  • 泛型编程关注算法,面向对象编程关注的是编程的数据方面。泛型编程,是编写独立于数据类型的代码。

  • 模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。

  • 每个容器类定义了相应的迭代器类型,对于其中的某个类,迭代器可能为指针;对另一个类,则可能是对象,无论如何实现,迭代器都将提供所需操作;每个容器类都有一个超尾标记,迭代器超越容器的最后一个值后,这个值江北赋给迭代器。

  • **作为一种编程风格,最好避免直接使用迭代器,应尽可能使用STL函数

  • 定义满足算法需求的迭代器,使通用算法能够适用于具体情况,而不是局限于数据结构

  • 迭代器类型:

    • 输入迭代器
    • 输出迭代器
    • 正向迭代器
    • 双向迭代器
    • 随机访问迭代器