简介

  • 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来删除容器中的元素