本篇博客笔记顺序大体按照《C++标准程序库(第1版)》各章节顺序编排。
--------------------------------------------------------------------------------------------
11 Strings 字符串
本章单独列出,讲述C++标准程序库中的string(字符串)型别,包括针对基本template class basic_string<>及其标准特化型别string和wstring的详细内容。 C++标准程序库中的string class 使你可以将string当做一个一般型别而不会令用户感觉有任何问题。你可以像对待基本型别那样地复制、赋值和比较string,再也不必担心内存是否足够、占用的内存实际长度等问题,只需运用操作符操作函数即可。简而言之,C++标准程序库对于string的设计思维就是,让它的行为尽可能像基本型别,不会在操作上引起什么麻烦。
11.1
以下语句:
strring::size_type idx = filename.find('.');
(1)在字符串filename中搜寻第一个'.'字符。有好几个函数可以在字符串内实施搜寻功能,函数find()是其中之一。你也可以从后向前搜寻,或是搜寻子字符串,或是在字符串的某个范围内搜寻,或是同时搜寻数个字符。所有这些搜寻函数都返回第一个匹配位置(一个索引)。没错,返回值是个整数,而不是迭代器。字符串的一般接口并不依赖STL概念。然而字符串的确也提供了数种迭代器。所有搜寻函数的返回型别都是string::size_type,这是string class 定义的一个无正负号整数型别。当然啦,第一个字符的索引值为0,最后一个字符的索引值是numberOfCharacters-1.注意,numberOfCharacters并不是一个有效索引。和C-string不同,string对象的字符串尾部并没有一个特殊字符' '.
(2)如果搜寻失败,必须返回一个特殊值来表示,该值就是npos,定义于string class 中。如下面这一行语句用来检验搜寻动作是否失败: if (idx == string::npos) 注意,当你打算检验搜寻函数的返回值时,应该使用string::size_type型别而不是int或unsigned。否则上述与string::npos的比较动作将无法有效运行。
11.2
(1)string型别和wstring型别
C++标准程序库提供了两个basic_string<>特化版本:
1. string是针对char而预先定义的特化版本:
namespace std { typedef basic_string<char> string; }
2. wstring 是针对wchar_t而预先定义的特化版本:
namespace std { typedef basic_string<wchar_t> wstring; }
(2)操作函数(Operations)
表11.1 列出针对字符串而设计的所有操作函数
(3)string的构造函数和析构函数(Constructors and Destructors)
(4)Strings和C-Strings C++ Standard 将字符串字面常数的型别由char* 改为const char*。为了提供向下兼容性,C++ Standard规定了一个颇有争议的隐式转换,可从const char*隐式转换为char*。由于字符串字面常数的型别并非string,因此在新的string object和传统的C-strings之间必须存在一种强烈关系:在“strings和string-like object共通的操作场合”(例如比较、追加、插入等等动作)都应该可以使用C-strings(也即,对于string object提供支持的函数,也都应该相应的支持C-string)。或者具体地说,存在一个从const char* 到strings的隐式型别转换。然而却不存在一个从string object 到C-string的自动型别转换。这是出于安全考虑,防止意外转型导致奇异行为(char*经常有奇异的行为)和模棱两可(例如在一个结合了string和C-string的表达式中,既可以把string转化为char*,也可以反其道而行,这就导致模棱两可)。有好几种办法可以产生或改写/复制C-string。更明确地说,c_str()可以得到“string 对应的C-string”,所得结果和“以‘