16.1

16.1 string类

头文件:
string类包含大量接口和构造函数。

构造字符串

string实际上是模板具体化basic_string 的一个typedef, 同时省略了与内存管理相关的函数(本章后面和附录F)
size_type是一个依赖于实现的类型:头文件:
string::nops定义为字符串的最大长度, 通常为unsigned int最大值。(NBTS表示以空字符结尾的字符串)
关于string方法函数的举例:P657

C++新增的构造函数

构造函数string(string && str) 类似于复制构造函数, 导致新创建的string为str的副本。
但是它不保证将str视为const:移动构造函数。第十八章移动语义和右值引用将讨论这个主题。
构造函数String(initializer_list il)可以将列表初始化语法用于string类。
string comp_lang { 'L', 'i', 's', 'p' };
本章后面继续讨论initializer_list

string类输入

有两种方式:
cin >> stuff;
getline(cin, stuff);
getline(stuff, ':');
getline可以自动调整目标string对象的大小, 使之刚好能够存储输入的字符。不需要指定读取多少个字符。
读取C风格字符串使用的是istream的方法, 而string类是独立的函数。
string版本的getline函数从输入中读取字符, 存储到string对象中, 知道发生一下情况之一:
1.到达文件尾:这种情况, eofbit将被设置, 意味着方法fail()和eof()都返回true。
2.遇到分界符:默认为'\n', 将分界符从输入流中删除, 不存储它。
3.读取到字符数允许的最大值:将设置输入流的failbit, 意味着fail方法将返回true。
输入流对象有一个统计系统, 用于跟踪流的错误状态:
文件尾设置eofbit寄存器
输入错误设置failbit寄存器
无法识别故障(如硬盘故障)设置badbit寄存器
一切顺利设置goodbit寄存器
第十七章深入探讨
可以用string来从文件中读取输入(可以识别文件尾)

使用字符串

string对六个关系运算符都进行了重载。
每个关系运算符都被重载了三次:C风格字符串、stirng之间
size()、length()成员函数返回字符串中的字符数
length来自较早版本的string类
size是为提供STL的兼容性而增加的
find方法有四个版本。
string库还提供了相关的方法:
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()

string还提供哪些功能

string库中:... ...
附录F简要地介绍了string库中的函数
很多C++实现分配一个比实际字符串大的内存块, 为字符串提供了增大空间。然而, 如果字符串不断增大, 超过了内存块的大小, 程序将分配一个原来两倍的内存空间。避免不断分配内存块。
方法:
capacity
reserve
c_str

字符串种类

string库实际上是基于一个模板类的
有三个具体化:
typedef basic_string string;
typedef basic_string wstring;
typedef basic_string u16string; // C++11
typedef basic_string u32string; // C++11