标准库类型 string
- 标准库类型
string表示可变长的字符序列。 - 使用
string类型必须要包含头文件<string>。 string定义在命名空间std中。
定义和初始化string对象

直接初始化和拷贝初始化
如果使用等号(==)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新建的对象中去。
如果不使用等号则执行的是直接初始化。
当初始值只有一个时,使用直接初始化或拷贝初始化都行,如果初始化要用用到的值由多个,一般来说只能使用直接初始化。
string s5 = "hiya"; //拷贝初始化
string s6("hiya"); //直接初始化
string s7(10,'c') //直接初始化
string对象上的操作

读写string对象
string s;
cin >> s; //将string对象读到s,遇到空白停止
cout << s << endl; //输出s
读入字符串时,string 对象会自动忽略开头的空白(即空格符、换行符、制表符)并从第一个真正的字符开始读起,直到遇到下一个空白符为止。
读取未知数量的 string 对象:
string word;
while (cin >> word) //反复读取,直到文件末尾或非法输入
cout << word << endl;
使用getline读取一整行
string line;
while (getline(cin,line))
cout << line << endl;
getline 函数的参数是一个输入流和一个string对象,函数从指定输入流中读入内容,直到遇到换行符为止(换行符也会被读进来),然后把所读的内存存到那个string对象中(不存换行符)。
string 的 empty 和 size 操作
empty 函数根据 string 对象是否为空返回一个对应的布尔值。
size 函数返回 string 对象的长度,也就是 string 对象包含的字符个数。
string::size_type 类型
size 函数返回的是 string::size_type 类型的值。
string::size_type 类型是一个无符号类型的值,而且能够存下任何 string 对象的大小。
如果一条表达式中已经有了 size 函数,就不要再使用int等带符号类型,避免混用有符号类型和无符号类型造成错误。
string 对象的比较
string对象的比较是按照字典顺序的。- 两个
string对象的长度不同,而且较短的string对象的每个字符都与较长string对象对应位置上的字符相同,则较短string对象小于较长string对象。 - 如果两个
string对象在某些对应位置上不一致,则string对象比较的结果其实就是string对象中第一个相异字符串的比较结果。
两个string对象相加
两个 string 对象相加得到一个新的 string 对象,其内容是把左侧的原酸对象与右侧的运算对象串接而成。
字面值和string对象相加
当把 string 对象和字符字面值及字符串字面值混在一个语句使用时,必须确保每个加法运算符的两侧至少有一个是 string。
string s4 = s1 + ","; //正确,把一个string对象和一个字面值相加
string s5 = "hello" + ","; //错误,两个运算对象都不是string
处理string对象中字符

注意:
C++标准兼容C语言标准库,C语言头文件形式为 name.h,C++则将这些文件命名为cname,也就是去掉了 .h 后缀。
一般来说,C++程序应该使用 cname 的头文件,而不使用 name.h 的形式。
使用基于范围for语句处理每个字符
范围 for 语句是C++11新标准提供的一种语句。
for (declaration : expression)
statement
expression部分是一个对象,用于表示一个序列。declaration部分定义一个变量,该变量用于访问序列中的基础元素,每次迭代,declaration部分的变量会被初始化为expression部分的下一个值。
使用范围for语句改变字符串中的字符
如果想改变 string 对象中的字符的值,必须把循环变量定义成引用类型。
string s("hello,world");
for (auto &c : s)
c = toupper(c);
只处理一部分字符
如果需要处理 string 对象中的每一个字符,使用范围 for 语句是一个不错的方法,但是如果只是想访问其中一个字符,或者访问多个字符但遇到某个条件就要停下来。若想访问 string 对象中单个字符有两种方法:
- 使用下标。
- 使用迭代器。
使用下标访问string对象
下标运算符接收的输入参数是 string::size_type 类型的值,这个参数表示要访问的字符位置;返回值是该位置上字符的引用。
string对象的下标必须大于等于0而小于s.size()。- 在访问指定字符之前,首先应该检查
string对象是否为空。 - 使用下标执行迭代:
string s;
for (decltype(s.size())index = 0;index !=s.size();++index)