类string重新自定义了字符串。标准库 string 表示可变长的字符序列。
头文件
#include<string>
定义和初始化 string 对象
初始化 string 对象的方式
string 对象;
// 默认初始化,该对象是一个空字符串string 对象1 = 对象2;
// 对象1的内容与对象2的内容相同string 对象 = 字符串字面量;
// 该对象的内容是此字符串字面量【该字面值中除了最后的空字符外其他所有的字符均被拷贝到新建的 string 对象中去】 拷贝初始化string 对象(字符串字面量);
// 该对象的内容是此字符串字面量 直接初始化string 对象(数字 n ,字符 c);
// 该对象的内容是 n 个字符 c 直接初始化
直接初始化与拷贝初始化
使用等号(=)初始化一个变量,实际执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中。不使用等号,执行的是直接初始化。
初始值只有一个时,使用直接初始化和拷贝初始化都行,初始化要用到的值有多个时,一般使用直接初始化。非要使用拷贝初始化的方式处理也可以,但需显示地创建一个(临时)对象用于拷贝。
string 对象 = string(数字 n ,字符 c);
拷贝初始化
该对象的初始值是string(数字 n ,字符 c);
,是一个 string 对象,然后这个 string 对象又拷贝给了前面声明的对象,等价于:
string temp(数字 n ,字符 c);
string 对象 = temp;
操作
- string直接支持字符串连接
- string直接支持字符串的大小比较
- string直接支持子串查找和提取
- string直接支持字符串的插入和替换
- string同时具备字符串数组的灵活性,可以通过[ ]重载操作符来访问每个字符。
读写 string 对象
可使用 IO 操作符读写 string 对象,string 对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一个空白符为止。多个输入和多个输出可连写在一起【因为返回运算符左侧的运算对象作为结果】。
读取未知数量的 string 对象
int main(){
string word;
while(cin>>word)//在读取时检测流的情况,如果流有效【没有遇到文件结束标记或非法输入】,执行while语句内部的操作
...;
return 0;
}
getline() 读取一整行
使用 getline() 保留输入时的空白符,参数是一个输入流和一个 string 对象,函数从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读入),将所读的内容存到 string 对象中(不存换行符)。只要遇到换行符就结束读取操作并返回结果,一开始输入换行符也是如此【得到的结果是空 string】。返回流参数,可使用 getline 的结果作为条件。
int main(){
string line;
while(getline(cin,line))//line中不包含换行符
...;
return 0;
}
empty()
根据 string 对象是否为空返回对应布尔值。
string.empty()
size() 长度
返回 string 对象的长度,即 string 对象中字符的个数。
string.size()
返回值
返回 string::size_type 类型的值。
string 类及其他大多数标准库类型均定义了几种配套的类型,体现出标准库类型与机器无关的特性。使用时通过作用域操作符表明名字 size_type 是在类 string 中定义的。
是无符号类型的值,能足够存放下任何 string 对象的大小,所有存放 string 类的 size 函数返回值的变量都是 string::size_type 类型。
auto len = line.size();
//len 的类型是 string::size_type
比较 string 对象
逐一比较 string 对象中的字符,且对大小写敏感。
相等运算符 ==/!=
==和!=分别检验两个 string 对象相等或不相等,相等意味着长度相同而且所包含的字符也相同。
关系运算符
<、<=、>、>= 分别检验一个 string 对象是否小于、小于等于、大于、大于等于另一个 string 对象。
依照大小写敏感的字典顺序比较:
- 如果两个 string 对象的长度不同,而且较短 string 对象的每个字符都与较长 string 对象对应位置上的字符相同,则说明较短 string 对象小于较长 string 对象。
- 如果两个 string 对象在某些对应的位置不一样,则 string 对象比较的结果其实是 string 对象中第一个相异字符比较的结果。
赋值
允许把一个对象赋值给另外一个对象。
相加
两个 string 对象相加
两个 string 对象相加得到一个新的 string 对象,其内容是把左侧的运算对象与右侧的运算对象串接而成【前半部分是加号左侧的运算对象所含的字符,后半部分是加号右侧所含的字符】。+= 将右侧 string 对象的内容追加到左侧的 string 对象的后面。
字面值和 string 对象相加
字符字面值和字符串字面值转换成 string 对象,在需要 string 对象的地方可以用字符字面值和字符串字面值代替。把 string 对象和字符字面值/字符串字面值混在一条语句中时,必须确保每个加号运算符(+)的两侧的运算对象至少有一个是 string 对象。
string s1 = (s2 + 字面值1) + 字面值2;
//s2+字面值得到一个 string 对象
等价于:
string tmp = s2 + 字面值1;
s1 = tmp + 字面值2;
字符串字面值与 string 是不同的类型。
处理 string 对象中的字符
遍历所有字符
for(declaration : expression)
statement;
expression 是一个对象,表示一个序列。declaration 定义一个变量,用于访问序列中的基础元素。每次迭代,declaration 的变量会被初始化为 expression 的下一个元素值。
一个 string 对象表示一个字符的序列,string 对象可以作为范围 for 语句中的 expression 部分。
使用范围 for 语句改变字符串中的字符
把循环变量定义成引用类型可以改变 string 对象中字符的值。引用只是给定对象的一个别名,使用引用作为循环控制变量时,该变量实际上被依次绑定到序列的每个元素上,使用该引用,可改变其绑定的字符。
访问部分字符
访问 string 对象中的单个字符的方法:一是使用下标,二是使用迭代器。
下标运算符 []
接收的参数是 string::size_type 类型的值,表示要访问的字符的位置。返回该位置上字符的引用。下标从0计起,下标必须>=0且<s.size()。
任何一个表达式的值只要一个整型值就可作为索引,如果某个索引是带符号类型的值,将会自动转换成由 string::size_type 表达的无符号类型。
在访问指定字符之前,首先检查 s 是否为空。只要对 string 对象使用下标,需确认在那个位置上确实有值。如果 s 为空,则 s[0] 的结果是未定义的。
只要字符串不是常量,就能为下标运算符返回的字符赋新值。
使用下标执行迭代
for(decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)