文章目录
- 1. 什么是STL
- 2. STL六大组件
- 3. 标准库中string类
- 3.1 auto关键字
- 3.2 范围for
- 3.3 string类的类型
- 3.4 string类的常用接口(string类对象的常见构造)
- 3.5 string的析构和赋值运算符重载
- 3.6 string类对象的容量操作
1. 什么是STL
- STL(standard template library—标准模板库):是C++标准库的重要组成部分,而且它还是一个涵盖数据结构与算法的软件框架
- STL发展至今一共出现4个版本,原始版本、P.J.版本、RW版本、SGI版本,而我们主要学习第4个版本,它的命名风格和编程风格阅读性非常高
2. STL六大组件

- STl六大组件的内容有点多,不过也有一些我们之前见过的Stack、Queue等,它就是集数据结构与算法的一个标准库,所有内容后期会慢慢讲,今天先来学习第一个,容器中的string类,容器说白了,就是数据结构
3. 标准库中string类
- C语言标准库提供了一些str系列的库函数,用来处理字符串,但是这些库函数和字符串是分离开的,底层空间需要用户自己管理,可能还会越界访问,因此C++特别引入了string类来进一步完善字符串的操作
- 在讲string前,先学习2个在string类里面经常使用的auto和范围for
3.1 auto关键字
- C++11之前,auto修饰的变量,是具有自动存储器的局部变量,之后C++11赋予auto全新的含义:auto不再是一个存储类型的指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导可得
- 简单的说,auto修饰的变量,它的类型是由操作符右边的对象推导出来的

- 一行声明多个变量时,这些变量的类型必须相同,否则编译器会报错,编译器只对第一个类型推导,然后用退出来的类型定义其他变量
- auto不能作为函数的参数,但是可以做返回值
- auto不能直接用来声明数组


- 上面简单介绍了auto的用法,它是根据已知对象的类型来推导新创建的对象,但是上面的场景一般不用auto,按照之前的逻辑写就没有任何问题,为何还要多此一举呢?但是有些场景下,auto用起来就比较爽

- 这是一个容器,可以看出
dict这个对象的类型就挺长,map就是一个容器,这个我们以后讲,这里先见识一下auto的使用场景
3.2 范围for
- 对于一个有范围的集合,程序员自己来说明循环的范围有点多余,还容易出错,因此C++11引入了范围for的概念,它从
冒号:开始分为两部分,冒号前面接迭代的变量,最后+迭代的范围 - 范围for自动迭代,自动取数据,自动判断结束
- 范围for可以用到数组和容器对象上的遍历
- 范围for的底层很简单,容器遍历就是替换为迭代器,这个我们以后会讲

- 范围for在遍历数组时,从起始位置开始将元素赋值给对象e,然后数组指向下个元素,再将数组下个元素赋值给元素e,以此类推,直到遍历完整个数组
- 如果不想让数组arr赋值给对象e,可以使用引用
- 范围for有三个自动:自动取对应容器(如:数组、列表等)里面的元素,自动++找下个元素,自动判断结束
for (auto element : range) {
}
- range可以是数组、列表、向量或者任何可以生成迭代器的范围


3.3 string类的类型
- C++string类中引入了几个char类型,简单了解下
- wchar_t是宽字节类型,大小为2个字节
- char16_t为2个字节,char32_t为4个字节大小

3.4 string类的常用接口(string类对象的常见构造)

| 分类 | 功能说明 |
|---|
| string( ) | 构造空的string类对象,即空字符串 |
| string( const char* s) | 用常量字符串来构造string类对象 |
| string(const string& s) | 调用拷贝构造函数来初始化string对象 |
| string(const string& str, size_t pos, size_t len) | 从给定的string对象str的pos位置开始,拷贝构造len个字符给string新创建的对象 |
| string (const char* s,size_t n) | 用常量字符串s的n个字符构造string对象 |
| string(size_t n, char c) | 对string类的对象构造n个c字符 |





- string类的成员函数begin( )和end( )分别返回指针指向对应字符的位置,不过这是底层的实现方法,在C++他们被封装成了一个迭代器,用来访问string类的对象
3.5 string的析构和赋值运算符重载


3.6 string类对象的容量操作

| 函数名 | 功能说明 |
|---|
| size(重点) | 返回字符串有效字符长度 |
| length | 返回字符串有效字符长度 |
| capacity | 返回总空间大小 |
| empty(重点) | 判断字符串是否为空,是就返回true,否则返回false |
| clear(重点) | 清空有效字符 |
| reserve(重点) | 为字符串预留空间,防止插入数据时空间不足 |
| resize(重点) | 将有效字符的个数改成n个,多出的用字符c填补 |
| max_size(基本不用) | 返回容器可以容纳的最大的元素个数 |
| shrink_to_fit(慎用) | 减少容器的容量以适应其当前大小,并销毁超出当前大小的所有元素 |

- max_size也不常用,这里仅做了解,它表示容器可以容纳多大的空间,可以看出,它的数值很大,但是底层实现原理为数组,开不出那么大的连续空间





