C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

组件 标题
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

Containers 容器

什么是容器

容器,是可以承载,包含元素的一个器件,可以理解为平时所用的容器,但是容器内装的是数据而不是固体或者液体。

STL中各大容器的结构与分类

顺序性容器

容器 说明
vector 可变大小数组。相当于数组,可动态构建,支持随机访问,无头插和尾插,仅支持inset插入,除尾部外的元素删除比较麻烦。但使用最为广泛
deque 双端队列。支持头插、删,尾插、删,随机访问较vector容器来说慢,但对于首尾的数据操作比较方便
list 双向循环链表。使用起来很高效,对于任意位置的插入和删除都很快,在操作过后,以后指针、迭代器、引用都不会失效
forward_list 单向链表。只支持单向访问,在链表的任何位置进行插入/删除操作都非常快
array 固定数组。vector的底层即为array数组,它保存了一个以严格顺序排列的特定数量的元素

一般大多数的题目都可以使用vector容器,除非有特定需求使用其他容器更加合理方便;

如果需要在一串数字的头尾进行操作,偏向deque,对于较中间的元素操作,不推荐 ;

对于中间的元素插入或删除,可采用forward_list(单向链表)或list(双向链表),不需要移动元素,只需改变相关结点的指针域即可;

关联性容器

容器 简介说明
set/mutliset 集合/多重集合。对于set,在使用insert插入元素时,已插入过的元素不可重复插入,这正好符合了集合的互异性,在插入完成显示后,会默认按照升序进行排序,对于multiset,可插入多个重复的元素
map/mutlimap 映射/多重映射。二者均为二元关联容器(在构造时需要写两个参数类型,前者对key值,后者对应value值),因为有两个参数,因此在插入元素的时候需要配合对组pair进行插入,具体见深入详解

如果只负责查找内容,具体到某个单位,使用场景比如对手机游戏的个人的计分的存储,可以使用set或mutliset

如果需要同时放入容器的数据不止一个,并且是不同类型,比如一个为整型int,一个为string字符串型,就可以考虑使用map或mutlimap

容器适配器

容器 简介说明
stack 堆栈。其原理是先进后出(FILO),其底层容器可以是任何标准的容器适配器,默认为deque双端队列
queue 队列。其原理是先进先出(FIFO),只有队头和队尾可以被访问,故不可有遍历行为,默认也为deque双端队列
pirority_queue 优先队列。它的第一个元素总是它所包含的元素中优先级最高的,就像数据结构里的堆,会默认形成大堆,还可以使用仿函数来控制生成大根堆还是生成小根堆,若没定义,默认使用vector容器
  • 对于 stack 堆栈,在我们日常生活中类似于坐地铁、电梯;
  • 对于 deque 队列,在我们日常生活中类似于排队打饭;
  • 对于 pirority_queue,因为其本质是堆,可以考虑解决一些贪心问题;