Chapter3,Section3.2——Library string Type
类库中的string类型
string是一个含有许多字符的变长序列。要想使用string类型,必须要包含string的头文件。它被定义在std命名空间里面。现在我们只介绍string最常用的操作,一些其它的操作以后会介绍。
#include <string>
using std::string;
新标准除了详细说明了类库中提供的操作,它也加强了在实现这些的操作的效率。所以库类型对于普通的使用效率还是很高的。
(一)定义和初始化string
一些初始化string的方式:
string s1;
string s2(s2);
string s2 = s1;
string s3("value");
string s3 = "value";
string s4(n,'c'); //用n个字符c进行初始化s4
复制初始化:当我们使用=进行初始化变量时,实际上我们是让编译器采用复制初始化形式,就是将=右边的复制给等号左边的。例:string s = "ssss";
直接初始化:当我们省略=时进行初始化时就进行了直接初始化。例:string s("eeeee");
当我们想使用好多个值时,我们可以通过创建一个(临时)对象的方式不直接地使用复制初始化形式。
例:string s = string(10,'c');
(二)string类型的操作
string类型可以进行许多操作,其中的一些包括:
os<<s,is>>s,getline(is,s),s.empty(),s.size(),s[n],s1+s2,s1=s2,s1==s2,s1!=s2,<,<=,>,>=。
cin不能接收来自string里面的空白符(例如:空格,换行,tabs)。它接收string开始,直到到遇到下一个空白符结束。如果从cin输入的string开头有好多空白符,则忽略,从遇到的第一个字符开始读,直到到遇到下一个空白符结束。
要想在程序中读入空白符,则可以使用getline(is,string);
getline可以接收空白符。它从开始接收字符开始,到遇见下一个换行结束。如果接收的第一个字符是换行,则该string是空的。是getline返回的那个换行并不包含在string里面。
getline返回的是输入流参数,因此,我们能够像将输入操作符>>作为条件那样将getline作为一个判断的条件。
字符串判空函数:empty();
判断字符串长度的函数:size();其返回的是string::size_type类型的值。
string类型和大多数的其它类型定义了许多的伙伴类型,这些伙伴类型使得在机器无关的条件下可以使用库类型。而size_type类型就是其中的一个。使用它时要加上作用域操作符。它是一个无符号的类型并且能容纳任意的字符串长度。如果一个变量想要存储字符串的size函数的返回值,那么它应该是size_type类型的。
由于这个类型写起来很麻烦,在新标砖下可以使用auto和decltype来自动获取它的类型。
你可以通过在使用了size()的表达式里面不使用ints来避免很多由于unsigned和int的转换导致的问题。
字符串比较过程中是区分大小写的。
在字符串对象之间可以进行赋值。
当两个字符串相加时,左操作数会在末尾追加上右操作数。
由于类库中允许我们将字符literals和字符串literals转变为string,所以literals和字符串可以相加。但是相加时要保证每一个+的两边至少要有一个string类型的操作数。
两个string literals是没法进行相加的。
由于历史性的原因以及兼容C语言,string literals并不是标准的库string。所以要记住使用string literals和使用库string时是不一样的。
(三)处理string中的字符
有时候我们要处理string中的单个字符,在cctype头文件里定义了许多这样的方法。
例如:isalnum(c),isalpha(c),iscntrl(c),isdigit(c),isgraph(c),islower(s),isprint(c),ispunct(c),isspace(c),isupper(c),isxdigit(c),tolower(c),toupper(c)等。
C++类库里面包含了C的类库,C的头文件的后缀是.h,C++头文件是以cname形式的,其中的c代表了这个头文件是C类库中的一部分。
为了适应C++的书写习惯,在C++中最好都使用cname形式的头文件。
处理string中的单个字符的方法:
(1)使用新标准里面的range-for语句,这个语句迭代遍历了表达式中的每一个元素,并且能够在每一个表达式中的值上进行一些操作。
结构如下:
for(declaration : expression)
statement
declaration声明了一个循环变量,我们通过这个变量可以访问表达式里面的元素。
如果想要改变string中的字符的值,我们必须把那个循环变量定义成引用类型。
(2)下标法[],[]操作符里面的的下标值是size_type类型的,这个操作符返回的是给定位置的字符引用。下标从0开始直到s.size()-1。
一个string的下标值必须在0和size()之间,在string上使用这个范围之外的下标,其值是unfined。给一个空string应用下标。它的值一个undefined。
如果下标值是有符号的类型,那么它的值将会被转换为相应的string::size_type类型代表的无符号值。
当我们使用下标法时,必须确保下标值是在正确的范围内的。为了简便,我们最好使用size_type类型来确保下标是无符号的,然后我们只需要检验下标是否小于size()方法的返回值就行了。
类库不会去检验下标的值,使用范围以外的下标时其结果是unfined。
使用下标法还可以随机访问string里面的单个字符(下标必须在给定范围内)。