STL
类型string
标准库类型string
表示可变长的字符序列,使用string
首先必须包含string
头文件,即include <string>
,string
定在在命名空间std
中,因此可以使用using
声明来简化代码(using std:string
)
在C++中兼容C语言标准库,因此include <ctype.h>
和include <cctype>
引入的内容是一样的,但是include <cctype>
从属于命名空间std
,而include <ctype.h>
则不属于。
定义和初始化string
对象
直接初始化和拷贝初始化
在C++
语言中,对于使用等号=
的初始化语句,例如上图中的string s2 = s1
和string s3 = "value"
,均是拷贝初始化,编译器将右边的值复制一份到左边的新对象中去;若不使用=
则是直接初始化。
string
对象的操作
读写操作
<<
操作符可以从标准输入流中读取string
对象,>>
操作符可以将标准输出进行输出。 注意点:<<
会自动忽略开头的空白,并且默认到下一个空格处结束。
// 标准输入为 " HELLO WORLD n"
string str;
cin >> str;
cout << str;
output:"HELLO"
对于需要读入一整行的需求,可以使用getline(cin, str)
来进行读取,该操作与cin
不同,会以n
为结束符(暗示本次输入结束)
// 标准输入为 " HELLO WORLD n"
string line;
getline(cin, line);
cout << line;
output: " HELLO WORLD "
其中n
被getline
函数抛弃,得到的string
对象不会包含换行符n
note:endl
可以作为换行符,与n
的区别是endl
输出换行符并且刷新缓冲区,而手动输出n
并不会刷新缓冲区。
empty
和size
操作
empty
函数会判断stirng
对象是否为空,若其为空则返回true
,否则返回false
; size()
函数返回string
对象的长度(string
对象中的length()
函数是一样的效果,两者在底层调用相同的接口(vs2019))
从图中可以看到size()
函数返回的是一个size_type
类型的值。size_type
能够让标准库在不同的机器上正确运行,忽略机器之间的差异,不需要程序员来考虑不同机器之间的区别(例如位数)。因此size_type
在不同机器上不同编译平台上位数是不一样的。size_type
是一个无符号数,能够表示任何string
对象大小(有时超过int
表示范围, 溢出后int
对象始终为负,可能造成一些意想不到的bug),因此在接受str.size()
时,最好使用以下中的一种:
auto len = line.size();
decltype(line.size()) len = line.size();
string::size_type len = line.size();
size_type
最大的表示数为string::npos
, 当size_type
被定义为32位时,string::npos
的最大值为4294967295
, 用int
类型接受时为-1
; 该值对于string
对象的find
函数有非常大的作用。
string
对象的比较
string
对象的比较其实是返回字典序比较的结果。
字典序比较: 对于序列<$a_{1}$, $a_{2}$, $a_{3}$...$a_{n}$..> 和 <$b_{1}$,$b_{2}$,$b_{3}$...$b_{n}$...>而言,<$a_{1}$, $a_{2}$, $a_{3}$...$a_{n}$..>小于<$b_{1}$,$b_{2}$,$b_{3}$...$b_{n}$...>是指: 存在下标m, 使得$a_{1}$ =$b_{1}$, $a_{2}$ = $b_{2}$... $a_{m}$ = $b_{m}$, $a_{m+1}$ < $b_{m + 1}$... (后续的随意)
string
的比较通过>
、>=
、==
、!=
、<=
、<
来进行
string
对象的相加
相加有两种方式+
与+=
对于+
而言,会产生一个新的string
对象。 如s1 = s1 + s2
, 其中s1+s2
会产生一个临时的副本(string
对象),然后把结果拷贝给s1
。 对于+=
而言,会直接在已有对象后面加上新对象,而不会产生副本。 如s1+=s2
, 该操作会直接在s1
后面增加s2
的内容,而不会有临时的string
对象产生
注意点: 对于字面值常量与string对象相加而言,必须保证+
前后至少有一个string
对象。如"string str = hello"+"world"
是错误写法,因为+
前后全是字面值常量,而非string
对象
后续更多内容如迭代器等学到后面再来补充