第 16 章 string
类和标准模板库
16.1 string
类
string
类16.2 智能指针模板类
要创建智能指针对象,必须包含头文件 <memory>
。离开代码块后,智能指针将自动释放内存。
声明只能指针的方法为 auto_ptr<Type> pt(new Type);
,然后可以将 pt
当作普通指针使用而无需 delete
。
使用赋值语句或者复制构造函数时,auto_ptr
会转让所有权,只有一个智能指针可以拥有该对象。转让所有权后再用原智能指针访问该对象将产生不确定行为。如果使用 unique_ptr
则会认为该语句非法,仅当原指针时临时右值时才允许赋值操作。而 shared_ptr
会进行引用计数跟踪引用对象,仅当最后一个指针过期时,才调用 delete
。
禁止在容器对象中使用 auto_ptr
,但可以使用 unique_ptr
,防止持久的所有权转让。auto_ptr
不允许用于数组,但 unique_ptr
允许。
如果必须给 unique_ptr
赋值,则需要使用 std::move()
函数。
如果程序需要使用多个指向同一对象的指针,则应该使用 shared_ptr
,否则应该使用 unique_ptr
。如果用函数分配内存,应该返回 unique_ptr
使所有权转让给接受返回值的 unique_ptr
。
模板 shared_ptr
包含一个显式构造函数,可用于将右值 unique_ptr
转换为 shared_ptr
。
16.3 标准模板库
所有的 STL 容器都提供了一些基本方法,包括返回容器中元素数目的 size()
,交换两个容器内容的 swap()
,返回第一个元素的迭代器 begin()
,返回一个超过容器尾的迭代器 end()
。
声明并使用迭代器 vector<double>::iterator pd = scores.begin(); *pd = 10; pd++;
,可以看出迭代器的行为类似于指针。
for_each(books.begin(), books.end(), show)
函数可以代替 for
循环对区间内每个元素执行同样的操作。random_shuffle(books.begin(), books.end())
函数可以随机排列区间内的元素。sort()
第一种函数允许传入两个迭代器,函数将使用对象的 <
运算符对区间内元素进行升序排序;第二种函数允许传入两个迭代器和一个返回布尔类型的函数指针,可以实现降序排序。
16.4 泛型编程
泛型编程的函数独立于容器中存储的数据类型,而且独立于容器本身的数据结构;因此模板也需要这两种数据类型的通用表示。
C++ 将 operator++()
用作前缀版本,operator++(int)
用作后缀版本。
STL 定义了输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器五种类型。
16.5 函数对象
可以重载函数符 ()
使模板类中函数指针实现函数调用功能。