简介
- C++ 标准模板库(Standard Template Library, STL)是一套功能强大的C++模板类和函数的集合,它提供了一系列通用的,可复用的算法和数据结构。
- STL的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定数据类型的代码。
- STL分为多个组件,包括容器(Containers),迭代器(Iterators),算法(Algorithms),函数对象(Function Objects)和适配器(Adapters)等
- 使用STL的好处
- 代码复用: STL提供了大量通用数据和算法,可以减少重复编写代码的工作
- 性能优化: STL中的算法和数据结构都经过了优化,以提供最佳的性能
- 泛型编程: 使用模板,STL支持泛型编程,使得算法和数据结构可以适用于任何数据类型
- 易于维护: STL的设计使得代码更加模板化,易于阅读和维护
- C++标准模板库的核心包括以下重要组件
- 容器(Containers): 容器是STL中最基本的组件之一,提供了各种数据结构,包括向量(vector),链表(list),队列(queue),栈(stack),集合(set),映射(map)等。这些容器具有不同的特性和用途,可以根据实际需求选择合适的容器
- 算法(Algorithms): STL提供了大量的算法,用于对容器中的元素进行各种操作,包括排序,搜索,复制,移动,变换等。这些算法在使用时不需要关心容器的具体类型,只需要指定要操作的范围即可。
- 迭代器(iterators): 迭代器用于遍历容器中的元素,允许以统一的方式访问容器中的元素,而不用关心容器的内部实现细节。STL提供了多种类型的迭代器,包括随机访问迭代器,双向迭代器,前向迭代器和输入输出迭代器等
- 函数对象(Function Objects): 函数对象是可以像函数一样调用的对象,可以用于算法中的各种操作。STL提供了多种函数对象,包括一元函数对象 ,二元函数对象,谓词等,可以满足不同的需求
- 适配器(Adapters): 适配器用于将一种容器或迭代器适配成另一种容器或迭代器,以满足特定的需求。STL提供了多种适配器,包括栈适配器(stack adapter),队列适配器(queue adapter)和优先队列适配器(priority queue adapter)等。
- Containers are used to store the data
- Algorithms are used to process the data
- Functors are used to write custom algorithms
- Iterators are used to navigate through the data
- All of them are part of STL
容器
- 容器是用来存储数据的序列,他们提供了不同的存储方式和访问模式
- STL中的容器可以分为三类:
- 序列容器: 存储元素的序列,允许双向遍历
- std::vector: 动态数组,支持快速随机访问
- std::deque: 双端队列,支持快速插入和删除
- std::list: 链表,支持快速插入和删除,但不支持随机访问
- 关联容器: 存储键值对,每个元素都有一个键(key)和一个值(value),并且通过键来组织元素
- std::set: 集合,不允许重复元素
- std::multiset: 多重集合,允许多个元素具有相同的键
- std::map: 映射,每个键映射到一个值
- std::multimap: 多重映射,允许多个键映射到相同的值
- 无序容器(C++11引入): 哈希表,支持快速查找,插入和删除
- std::unordered_set: 无序集合
- std::unordered_multiset: 无序多重集合
- std::unordered_map: 无序映射
- std::unordered_multimap: 无序多重映射
- 序列容器: 存储元素的序列,允许双向遍历
- 合理的容器选择是高效实现的至少50%
- 请充分考虑不同容器的操作复杂度
- 删除和插入
- 访问速度
- 是否需要顺序
- 高效使用std::vector需要注意
- 尽量减少增量resize()。推荐使用reserve(),不改变大小
- 如果是一个类的vector,尽量使用emplace/emplace_back,它会有先调用placement new或者move constructor从而减少中间拷贝
- 避免iterator失败。大部分情况,尽量使用algorithm库中的remove_if来删除容器中的元素