标准库类型 string

标准库类型 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)
原文地址:https://www.cnblogs.com/xiaojianliu/p/12498412.html