没写完没写完,CSDN又不让我删了重新编辑,就先放个半成品在这,这两三天就写完
-------------
什么是string,为什么要学习string
C 语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP 的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
在刷题的时候也经常可以看到一些题目:
类似将字符串交换位置、相加、转化整形等
在这些题目里面,题目基本都是以string类的形式出现:
string是字符串类型,对于字符串的操作用string来会更加简单、方便且快捷
---------
标准库的string
这里有一个C++的网站可以帮助我们来了解string,缺点是全英文
string - C++ Reference (cplusplus.com)
这里借用参考的翻译:
1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string 类是使用 char( 即作为它的字符类型,使用它的默认 char_traits 和分配器类型 ( 关于模板的更多信息,请参阅basic_string) 。4. string 类是 basic_string 模板类的一个实例,它使用 char 来实例化 basic_string 模板类,并用 char_traits和allocator 作为 basic_string 的默认参数 ( 根于更多的模板信息请参考 basic_string) 。5. 注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( 如 UTF-8) 的序列,这个类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。
大概也就是看着多,这里可以这么理解:
string是一个字符串类型
这个类里面的操作办法跟常规的接口相同,然后加了一些专门操作string的函数
string的底层是basic_string模板类的别名
不能操作多字节或者变成字符的序列
要包含头文件<string>
常用的几个接口
初始构造:
string有以下几个构造的办法:
string c1 = "hellow world"; //通过字符串的初始赋值
string c2("hello world"); //同上
string c3(c1);//拷贝构造
除此之外,还有多种构造:
string c4("hello worldxxxxxxxx", 11); //截取长字符串的前n个字符
string c5(10, 'c'); //开十个字节的空间并全部初始化为字符c
string c6("xxxhello worldxxxx", 3, 11); //用一个常量字符串的下标为3的位置到下表为11的位置初始化c6
总之,挺多的,当然,也可以什么都不给,创见一个空的字符串:
string c7;
但是如果直接去打印出来看的话,会发现这里直接空的一排:
如果这个时候调试,我们会看到这样的三个数值
size、capacity和原始试图,暂且不管最后的原始视图,先看前面两个参数:
size指的是string里面有的字符数量,而capacity则是还可以放多少
这里什么都没打印出来,里面真一个字符都没有吗?
倒也不是
因为它(C++)要兼容C,所以这里其实还有一个'\0'
-------
string的容量操作
这里要介绍几个常用的:
size:返回字符串的有效字符长度
length:返回字符串有效字符长度(跟上面类似,甚至功能重叠,还是C的问题...)
capacity:返回空间总大小
empty:检查字符串是否为空,如果为空就返回true,反之
clear:清空有效字符串
reserve:为字符串保留空间
resize:将有效字符串的个数改成n个,其他的空间会被字符填充
----
一个一个来看:
size和length
可以看到返回的字符大小里面不包括最后的’\0‘
----------
capacity
上面我们拿一个空字符串来看的时候这里的capacity也是15,所以string的初始字符串容量是15个字节,这里提一下,如果空间不够用的话它会自动扩容,大小大概是自身的1.5倍
-------------
empty
-----------
clear
可以看到第一次还能打印出hello world,在用过一次clear后就什么也打印不出来了
------------
reverse
这里,c1原本是容量是15,初始化hello world用了11的空间,剩4个,然后我reserve里面填20,让编译器给我保留20个字节的空间,它就扩容11+20 = 31个字节的空间
这是往大了扩,加入我要往小了,会发生什么?
可以看倒初始的容量是15个字节,15-11=4,这里还剩4个字节的空间,我要保留2个字节:
还是15个字节,也就是说它不会往小了改变容量,如果这里看的不详细,我们把容量变大一点:
首先15个字节的空间,开辟到200,然后再缩减到50,可以看到里面的容量还是200,没有改变。
再看详细一点,打开调试:
一开始的11个字节和15容量没有截图,这里是扩容至200&