本节博客主要是介绍了一下CPP标准库中的string这一容器的相关用法和常用接口,有需要借鉴即可。
1.string介绍
1.1CPP标准库与STL关系
SLT是什么?
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
CPP标准库是什么?
CPP标准库指的是现有的可直接使用的流、函数、接口…
CPP标准库与STL是包含关系,STL属于CPP标准库的一部分,也可说STL是CPP标准库的核心数据结构与算法的总集。两者关系如下图所示:
1.2string历史问题与介绍
按照道理来讲,string应该属于STL中,但是因为历史遗留问题和编写年代的问题,string最终被归属于其他函数库中,标准中规定string并不属于STL。
参见:CPP标准库网站(非官网):LINK
但是实际上,string也是属于一种重要的数据结构,也应该归属到STL中去。
同时,string由于是被程序员最早实现的一批函数库,因而设计上谈不上完美,有些冗余(多达一百多个接口),因而在下面我只介绍string常用的几个接口。
2.string概要
从上面推荐的网站中,我们可以查到string的相关信息:
这个string底层是由类模板做的,也是typedef出来的。
思考:为什么用typedef和类模板?直接一个string类不好吗?
答:在单纯英文字母而言,string中只需要放char类型的字符,因而是可以的。但是由于各个国家语言文字随着计算机全球化的发展都需要映射到计算机中去,单纯的ascll编码已经不能满足人们需要,单纯的char类型也不能存储文字系统稍复杂的国家(比如中国),因而需要w_char来存入中国的文字,因而这里用了类模板。
3.Member functions
3.1constructor
这个地方常用的一个无参构造,一个字符串构造,还一个拷贝构造,其他了解即可。
析构函数这里就不说了。
3.2operator=
这里这三个都挺常用的,了解一下即可。
4.访问
string的访问有三种方式,一是[]下标访问,二是迭代器访问,三是范围for
4.1[]访问
注:size()取得大小不包括/0;
4.2迭代器访问
另外,迭代器分为
- 正向、反向;
- const、非const。
注:迭代器是一个用法上像指针的访问器,但不一定是指针。
4.3范围for访问
4.4at与[]重载
两者是一致的,但两者的区别在于at报错是抛异常,[]报错是断言错误。
5.capacity
5.1size与length
两者没有任何区别,size与STL库中其他的数据结构更加一致一些。
5.2max_size
返回最大的size
5.3resize
调整size大小,默认用\0进行填充
这里size有两种不同的情况:
①size < capacity 不会缩容,直接在对应位置+\0
②size > capacity 扩容,默认用\0进行填充
5.4capacity
返回string的空间大小
探寻vs下string的扩容机制:注,不同平台不同,这里仅指vs2022下的情况
void test3() { string s; size_t size = s.capacity(); cout << s.capacity() << endl; for (size_t i = 0; i < 200; i++) { s.push_back((char)i); if (size != s.capacity()) { size = s.capacity(); cout << "change:" << size << endl; } } cout << endl; }
5.5reserve 保留
先来区分俩单词:
reserve 保留
reverse 反转,颠倒
这个函数是用来扩容的,扩大空间。一般用来提高效率。
5.6clear
用来处理数据的
5.7empty
判空
5.8shrink_to_fit
缩容
详情:LINK
EOF