写点什么

C++ primer -- 第 16 章 string 类和标准模版库

用户头像
Dreamer
关注
发布于: 2020 年 11 月 02 日
C++ primer -- 第16章 string类和标准模版库




本章的内容是阅读《C++primer》第六版16章时,所写的笔记,仅供个人学习巩固所用。

内容如下:



  • 标准C++string库

  • 模版autoptr, uniqueptr,sharted_ptr

  • 标准模版库

  • 容器类

  • 迭代器

  • 函数对象

  • STL算法

  • 模版initializer_list






1. string类



C++11新增的构造函数string (string && str)。这种方式类似于f复制构造函数,导致新创建的string为str的副本,但是和复制构造函数不同的是,它不保证str视为const.这种构造函数被称为移动构造函数(move constructor).在有些情况下,可以使用移动构造函数,而不是复制构造函数,以优化性能。

构造函数初始化列表也可以用于string类。



string piano_man = {'L

', 'i', 's', 'z', 't'};

string comp_lang {'l', 'i', 's', 'p'};

string类输入



C-风格字符串



char info[100];

cin >> info; //read a word

cin.getline(info, 100); // read a line, discard \n

cin.get(info, 100); //read a line, leave \n in queue

string对象,有两种方式



string buff;

cin >> stuff; // read a word

getline(cin, stuff); // read a line, discard \n

功能的区别是,string 版本的getline()将自动调整目标string对象的大小。



读取string对象的时,要注意的三种情况:



* 到位文件尾, 输入流的eofnbit将被设置,这意味着fail()和eoff()都将返回true

* 遇到分界字符,在这种情况下,把分界字符从输入流中删除,但不存储

* 读取的字符数达到最大允许值,在这种情况下,将设置输入流的failbit



string 类还提供了别的函数,方法capcacity(),返回当前分配给字符串的内存快的大小,而reverse()方法可以通过请求内存快的最小长度。c_str()方法可以将string转换成c风格的字符串。



2. 智能指针模版类



智能指针是行为类似于指针的类对象。模版auto_ptr是C++98的解决方案。C++11中已经摒弃。



要创建指针必须包含头文件memory,该文件模版定义,然后使用通常的模版语法来实例化所需的指针。



template<class T> class auto_ptr

{

public:

explicit auto_ptr(X* p = 0) throw();

...

};

// 获取一个double类型的指针

autoptr<double> pd(new double); //pd an autoptr to double

//(use in place of double * pd)

//进取一个string类型的指针

autoptr<string> ps(new string); // ps an autoptr to string

//use in place of sgtring * ps

有关智能指针的注意事项



auto_ptr被摒弃,因为使用过程中过程中可能出现问题,看下面的例子:



auto_Ptr<string> ps (new string(" I reginede lonely as a cloud"));

auto_ptr<string> vocation;

vocation = ps;

上述语句将两个指针指向同一个对象,会造成程序删除对象两次时,报错。要避免这种错误,有以下集中供暖办法:



  • 定义赋值运算符,进行深拷贝

  • 建立所有权(ownership),对于特定的对象,只能让一个智能指针可拥有

  • 创建智能更高的指针,跟踪引用特定对象的指针数,称为引用计数



相比于autoptr, uniqueptr还有一个优点。它可以用于数组的变体。autoptr使用delete,uniquepte可以使用new[]和delete[].



选择哪种智能指针



如果程序中使用多个指向同一个对象的指针,选择sharted_ptr.



如果程序中国不需要多个指向同一个对象的指针可使用unique_ptr.



泛型编程



面向对象编程关注的是编程的数据方面,泛型编程关注的是算法。共同点是抽象和创建可重用代码,但是理念决然不同。



函数对象



函数符:



  • 生成器是不用参与参数就可以调用的函数符

  • 一元函数(unary function)是用一个参数可以调用的函数符

  • 二元函数(binary fucntion)用两个参数可以调用的函数符

  • 返回bool值的一元函数是谓词

  • 返回bool值的二元函数是二元谓词



算法



对于算法的设计,有来个主要的通用部分:



  • 使用模版来提供泛型

  • 使用迭代器来提供访问容器中数据的通用表示



算法组



STL算法分4组:



  • 非修改式序列操作: 对区间的元素操作,不修改容器的内容

  • 修改式序列操作:对区间中的元素操作,可修改容器的内容

  • 排序和相关操作

  • 通用数字运算(numeric)



用户头像

Dreamer

关注

一个不想做搜索的NLPer不是一个好的CVer 2019.12.18 加入

还未添加个人简介

评论

发布
暂无评论
C++ primer -- 第16章 string类和标准模版库