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)
评论