C++ Primer学习纪录(三)标准库string对象

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对象

string对象的初始化

直接初始化和拷贝初始化

C++语言中,对于使用等号=的初始化语句,例如上图中的string s2 = s1string s3 = "value",均是拷贝初始化,编译器将右边的值复制一份到左边的新对象中去;若不使用=则是直接初始化。

string对象的操作

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 "

其中\ngetline函数抛弃,得到的string对象不会包含换行符\n

note: endl可以作为换行符,与\n的区别是endl输出换行符并且刷新缓冲区,而手动输出\n并不会刷新缓冲区。

emptysize操作

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_{1} a1, a 2 a_{2} a2, a 3 a_{3} a3 a n a_{n} an…> 和 < b 1 b_{1} b1, b 2 b_{2} b2, b 3 b_{3} b3 b n b_{n} bn…>而言,< a 1 a_{1} a1, a 2 a_{2} a2, a 3 a_{3} a3 a n a_{n} an…>小于< b 1 b_{1} b1, b 2 b_{2} b2, b 3 b_{3} b3 b n b_{n} bn…>是指:
存在下标m, 使得 a 1 a_{1} a1 = b 1 b_{1} b1, a 2 a_{2} a2 = b 2 b_{2} b2 a m a_{m} am = b m b_{m} bm, a m + 1 a_{m+1} am+1 < b m + 1 b_{m + 1} bm+1… (后续的随意)

string的比较通过>>===!=<=<来进行

string对象的相加

相加有两种方式++=
对于+而言,会产生一个新的string对象。
s1 = s1 + s2, 其中s1+s2会产生一个临时的副本(string对象),然后把结果拷贝给s1
对于+=而言,会直接在已有对象后面加上新对象,而不会产生副本。
s1+=s2, 该操作会直接在s1后面增加s2的内容,而不会有临时的string对象产生

注意点: 对于字面值常量与string对象相加而言,必须保证+前后至少有一个string对象。如"string str = hello"+"world"是错误写法,因为+前后全是字面值常量,而非string对象

后续更多内容如迭代器等学到后面再来补充

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值