《C++ primer》英文第五版阅读笔记(九)——string(字符串)类型

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里面的单个字符(下标必须在给定范围内)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值