C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
string类是C++中表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。通过调用接口来操作string的常规操作。string在底层实际是:basic_string模板类的别名,不能操作多字节或者变长字符的序列。
typedef basic_string<char, char_traits, allocator> string;
因此使用string类比使用字符集合的字符串更方便,底层编译器都已经帮我们实现好了,直接调用即可
跟一些常见的类一样,可以拷贝构造,无参构造,传值传参构造。
可以看到以上的构造都是可以成功地创造出string类的对象,我们只需要记住常见的即可,不常见的如果有需求再查文档。
这两个没啥区别,都是返回字符串有效字符长度,不过按照使用C++的使用我个人更喜欢使用size。
看看运行的结果
看到字面意思就知道是返回空间容量总大小,需要注意的是空间大小不一定等于有效字符长度
这个就是检测字符串释放为空串,是返回true,否则返回false,还是比较属于比较常见的
清空有效字符,什么意思呢。假设先有一个对象s1,它里面存的是“hello world”,那这时我调用clear接口就可以将里面的“hello world”清空,再次打印就看不到了。
为字符串预留空间,也就是说这个接口是用来给string对象开辟空间的,但是会由于各个编译器底层的实现不同,因此可能会不是我们想指定的空间大小
首先来看看在VS2022下会发生什么
可以看到,当我们一创建对象编译器就已经自动开辟了15个空间大小,当我们想扩容到20时,它直接就扩容到了31。
接下来看看Linux操作系统下的g++编译器
可以看到,g++中如果我们没有给对象赋初值,它是不会开辟空间的,使用reserve的效果就出来了
将有效字符的个数该成n个,多出的空间用字符c填充,如果我们想改成的长度小于字符串的长度就有点像可以选择长度的clear()了。如果想改的长度比字符串长度大,那它就会自动的扩容,并且会用参数的char进行填充。如果没有char参数,就默认为’\0’
效果就很明显了
返回pos位置的字符,const string类对象调用,这个就很好理解了,就跟数组和C语言里的字符串一样,可以随机访问。
迭代器的使用就有点像指针,但它不一定是指针,具体的使用方法我们先来看看迭代器的一些接口
begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
反向的获取
下面来看看迭代器的使用方式
int main() {
string s1("hello world");
//首先创建一个string类迭代器指向第一个字符的迭代器
string::iterator it = s1.begin();
//遍历直到迭代器指向最后一个字符的迭代器
while (it != s1.end()) {
cout << *it << " ";
it++;
}
return 0;
}
和指针的使用是类似的,那么如果想反向的去获取呢,迭代器就要变个名称了
int main() {
string s1("hello world");
string::reverse_iterator it = s1.rbegin();
while (it != s1.rend()) {
cout << *it << " ";
it++;
}
return 0;
}
在这里就不说一些比较简单的了,例如push_back 那些的,下一篇文章讲模拟实现再写一下简单的底层原理
在字符串后追加字符串str,可以说push_back,append都不比这个用的多。想增加一个字符或者一个字符串直接+=搞定,也可以用于两个对象之间的追加
返回C格式字符串,直接将string类的对象转换为C语言的字符数组类型
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置,就是用来查找该字符串中的字符位置的
如果找到了,返回该字符在字符串中的位置;找不到则返回nops(由于其返回类型为size_t,所以就是最大的size_t)
还有一些rfing,find_first_of都是差不多的原理,可以自行查看文档了解
流输入和流输出重载是非常重要的,有了流输出重载我们才可以直接使用cout<<打印出整个字符串
上面讲的流输入当你去用的时候就会发现一些问题,如果你输入的字符串有空格就出现问题了
就像这样。这是我们就需要使用一个新的接口,getline:获取一行字符串
需要这样子才可以很好地将字符串输入
还有很多的接口,比如比较大小写的系统也是帮我们底层实现好了直接使用即可。这里我就挑了一些常见的讲讲,如果有需要可以去查看文档,
cplusplus
string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间:
这种设计有它的好处,因为大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高
G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:
string算是学习的第一个容器了
相当于C语言而言确实方便了很多
之后学习STL更多容器就能感受到C++的更多魅力了
加油!!!!