C++ 容器详解(已整理成表格)

目录

[1. vector](#1. vector)

[2. deque](#2. deque)

[3. list](#3. list)

[4. set](#4. set)

[5. map](#5. map)

[6. stack](#6. stack)

[7. queue](#7. queue)

[8. priority_queue](#8. priority_queue)

C++常见容器属性表

结语


本文将详细介绍常见的 C++ 容器,包括它们的定义、使用场景、功能、时间复杂度以及优缺点。最后,附上一个总结表格,方便快速查阅。


1. vector

定义

vector 是一种动态数组,可以根据需要自动调整大小。它提供了数组的所有功能,并且支持在末尾进行高效的插入和删除操作。

底层结构

vector 底层采用一块连续的内存空间,类似于 C 的数组。当 vector 的容量不足以容纳新元素时,会分配一块更大的内存,并将原数据复制到新内存空间中。

成员函数
  • push_back(const T& value): 在末尾插入一个元素。
  • pop_back(): 删除最后一个元素。
  • size(): 返回当前元素的个数。
  • capacity(): 返回当前分配的存储容量。
  • resize(size_t n): 调整容器大小。
使用场景

适用于需要动态调整大小的数组,常用于需要频繁插入、删除操作的场景,如动态数据管理。

访问和修改的时间复杂度
  • 访问: O(1)
  • 修改: O(1)
  • 插入/删除: O(1)(末尾),O(n)(其他位置)
优缺点
  • 优点: 支持动态调整大小,末尾操作高效,灵活性强。
  • 缺点: 在中间位置插入或删除元素时效率较低,因为需要移动其他元素。

2. deque

定义

deque(双端队列)支持在两端高效地进行插入和删除操作。与 vector 不同,它不仅可以在末尾,还可以在前端进行高效操作。

底层结构

deque 底层是由一组连续的内存块组成,提供了类似 vector 的随机访问能力,但允许在两端进行插入和删除操作。

成员函数
  • push_front(const T& value): 在前端插入一个元素。
  • push_back(const T& value): 在末尾插入一个元素。
  • pop_front(): 删除前端元素。
  • pop_back(): 删除末尾元素。
使用场景

适用于需要在两端进行频繁插入和删除操作的场景,如实现双端队列、滑动窗口等。

访问和修改的时间复杂度
  • 访问: O(1)
  • 修改: O(1)
  • 插入/删除: O(1)(两端)
优缺点
  • 优点: 支持双端操作,两端插入和删除效率高。
  • 缺点 : 随机访问效率不如 vector,内存使用效率略低。

3. list

定义

list 是一种双向链表容器,提供对数据的高效插入和删除操作。

底层结构

list 底层采用双向链表结构,每个节点包含前驱和后继指针,以及数据。

成员函数
  • push_front(const T& value): 在前端插入一个元素。
  • push_back(const T& value): 在末尾插入一个元素。
  • pop_front(): 删除前端元素。
  • pop_back(): 删除末尾元素。
  • insert(iterator pos, const T& value): 在指定位置插入元素。
  • erase(iterator pos): 删除指定位置的元素。
使用场景

适用于需要频繁在中间插入和删除元素的场景,如实现队列、链表等。

访问和修改的时间复杂度
  • 访问: O(n)
  • 修改: O(1)
  • 插入/删除: O(1)
优缺点
  • 优点: 插入和删除操作效率高,不需要移动其他元素。
  • 缺点: 访问效率低,无法随机访问元素。

4. set

定义

set 是一种有序集合,内部实现通常是红黑树。set 中的每个元素都是唯一的,且自动按顺序排列。

底层结构

set 底层通常采用红黑树(自平衡二叉搜索树)实现,保证了元素的有序性和高效的查找、插入、删除操作。

成员函数
  • insert(const T& value) : 插入元素并保持有序。
    • 参数 : const T& value - 要插入的元素。
    • 返回值: 返回一个包含插入结果的 pair,第一个元素是迭代器,第二个元素是布尔值,表示插入是否成功。
  • erase(iterator pos) : 删除指定元素。
    • 参数 : iterator pos - 指向要删除元素的迭代器。
    • 返回值: 无。
  • find(const T& value) : 查找指定元素。
    • 参数 : const T& value - 要查找的元素。
    • 返回值 : 返回指向找到元素的迭代器,如果未找到,则返回 end()
  • begin()end() : 获取指向第一个和最后一个元素的迭代器。
    • 参数: 无。
    • 返回值: 返回指向第一个或最后一个元素的迭代器。
使用场景

适用于需要存储有序且唯一的元素集合的场景,常用于需要快速查找和去重的场景。

访问和修改的时间复杂度
  • 访问: O(log n)
  • 修改: O(log n)
  • 插入/删除: O(log n)
优缺点
  • 优点: 元素有序,查找、插入和删除操作高效。
  • 缺点: 内存占用相对较高,插入和删除操作较慢。

5. map

定义

map 是一种关联容器,存储键值对,每个键在容器中是唯一的,内部实现通常是红黑树。

底层结构

map 底层通常采用红黑树(自平衡二叉搜索树)实现,保证了键值对的有序性和高效的查找、插入、删除操作。

成员函数
  • insert(const std::pair<Key, T>& value) : 插入键值对。
    • 参数 : const std::pair<Key, T>& value - 要插入的键值对。
    • 返回值: 返回一个包含插入结果的 pair,第一个元素是迭代器,第二个元素是布尔值,表示插入是否成功。
  • erase(iterator pos) : 删除指定元素。
    • 参数 : iterator pos - 指向要删除元素的迭代器。
    • 返回值: 无。
  • find(const Key& key) : 查找指定键的元素。
    • 参数 : const Key& key - 要查找的键。
    • 返回值 : 返回指向找到元素的迭代器,如果未找到,则返回 end()
  • operator[](const Key& key) : 访问或插入键值对。
    • 参数 : const Key& key - 要访问或插入的键。
    • 返回值: 返回指定键对应的值,如果键不存在,则插入一个新的元素。
使用场景

适用于需要存储键值对且要求有序的场景,常用于需要快速查找、插入和删除键值对的场景。

访问和修改的时间复杂度
  • 访问: O(log n)
  • 修改: O(log n)
  • 插入/删除: O(log n)
优缺点
  • 优点: 元素有序,查找、插入和删除操作高效。
  • 缺点: 内存占用相对较高,插入和删除操作较慢。

6. stack

定义

stack 是一种后进先出(LIFO)的数据结构,基于 dequevector 实现。只允许在一端进行插入和删除操作。

底层结构

stack 通常使用 deque 作为底层结构,也可以使用 vector。所有操作都限制在栈顶进行。

成员函数
  • push(const T& value): 压栈操作,在栈顶插入一个元素。
  • pop(): 弹栈操作,移除栈顶元素。
  • top(): 访问栈顶元素。
使用场景

适用于需要后进先出的操作场景,如括号匹配、递归调用栈等。

访问和修改的时间复杂度
  • 访问: O(1)
  • 修改: O(1)
  • 插入/删除: O(1)
优缺点
  • 优点: 操作简单,效率高。
  • 缺点: 只支持栈顶操作,无法随机访问。

7. queue

定义

queue 是一种先进先出(FIFO)的数据结构,通常基于 deque 实现。只允许在一端插入,在另一端删除。

底层结构

queue 通常使用 deque 作为底层结构,但所有操作都限制在队首和队尾进行。

成员函数
  • push(const T& value): 入队操作,在队尾插入一个元素。
  • pop(): 出队操作,移除队首元素。
  • front(): 访问队首元素。
  • back(): 访问队尾元素。
使用场景

适用于需要先进先出的操作场景,如任务调度、广度优先搜索等。

访问和修改的时间复杂度
  • 访问: O(1)
  • 修改: O(1)
  • 插入/删除: O(1)
优缺点
  • 优点: 操作简单,效率高。
  • 缺点: 只支持队首和队尾操作,无法随机访问。

8. priority_queue

定义

priority_queue 是一种优先级队列,通常基于堆实现。每次出队操作总是返回优先级最高的元素。

底层结构

priority_queue 底层通常基于堆(如二叉堆、Fibonacci 堆)实现,确保每次访问的元素是优先级最高的。

成员函数
  • push(const T& value): 插入元素并维护堆结构。
  • pop(): 删除优先级最高的元素。
  • top(): 访问优先级最高的元素。
使用场景

适用于需要动态维护一个优先级最高的元素的场景,如任务调度、最短路径算法等。

访问和修改的时间复杂度
  • 访问: O(1)
  • 修改: O(log n)
  • 插入/删除: O(log n)
优缺点
  • 优点: 高效地维护优先级,适用于需要频繁获取最值的场景。
  • 缺点: 无法随机访问,操作受限于堆的性质。

C++常见容器属性表

容器类型 使用场景 功能 查找时间复杂度 修改时间复杂度 优缺点
array 固定大小的数组,编译期确定大小 提供与C风格数组相似的功能,但支持STL算法 O(1) O(1) 内存连续分配,随机访问效率高,但大小固定,无法动态调整
vector 需要动态调整大小的数组 动态数组,支持在末尾进行快速插入和删除 O(1) O(1) (末尾),O(n) (其他位置) 支持动态扩展,末尾操作高效,但中间插入删除效率较低
deque 需要双端快速插入删除的场景 双端队列,支持在两端进行高效插入和删除 O(1) O(1) 双端操作高效,但随机访问效率不如vector,内存使用效率低
list 需要频繁在中间插入和删除元素的场景 双向链表,支持在任何位置进行快速插入和删除 O(n) O(1) 插入删除操作高效,顺序访问高效,但随机访问效率低
stack 后进先出的操作场景 后进先出(LIFO)的栈,基于dequevector实现 O(1) O(1) 操作简单,效率高,但只支持栈顶操作,无法随机访问
queue 先进先出的操作场景 先进先出(FIFO)的队列,基于deque实现 O(1) O(1) 操作简单,效率高,但只支持队首和队尾操作,无法随机访问
priority_queue 需要动态获取优先级最高元素的场景 基于堆实现的优先级队列,动态获取最优先的元素 O(1) O(log n) 适合频繁获取最值的场景,但无法随机访问,只能访问优先级最高的元素
set 需要有序且唯一的集合 有序集合,元素自动排序,支持快速查找和去重 O(log n) O(log n) 元素有序,查找插入删除高效,但内存占用较高
unordered_set 需要唯一且无序的集合 无序集合,基于哈希表实现,支持快速查找和去重 O(1) 平均 O(1) 平均 查找插入删除非常快,但内存占用相对较高,且不保证元素顺序
map 需要键值对映射,且键有序的场景 有序映射,基于红黑树实现,键值对自动按键排序 O(log n) O(log n) 键有序,查找插入删除高效,但内存占用较高
unordered_map 需要键值对映射,且键无序的场景 无序映射,基于哈希表实现,支持快速查找键值对 O(1) 平均 O(1) 平均 查找插入删除非常快,但内存占用较高,且不保证元素顺序
multiset 需要有序且允许重复元素的集合 有序集合,元素自动排序,允许重复元素 O(log n) O(log n) 允许重复元素,元素有序,查找插入删除高效,但内存占用较高
multimap 需要有序且允许重复键的键值对映射 有序映射,基于红黑树实现,允许重复键 O(log n) O(log n) 允许重复键,键有序,查找插入删除高效,但内存占用较高
unordered_multiset 需要无序且允许重复元素的集合 无序集合,基于哈希表实现,允许重复元素 O(1) 平均 O(1) 平均 允许重复元素,查找插入删除快,但内存占用较高,且不保证元素顺序
unordered_multimap 需要无序且允许重复键的键值对映射 无序映射,基于哈希表实现,允许重复键 O(1) 平均 O(1) 平均 允许重复键,查找插入删除快,但内存占用较高,且不保证元素顺序

下面是将所有基础类型的容器的类型、成员函数和功能介绍整理成的表格:

容器类型 成员函数 功能介绍
vector push_back(const T& value) 在末尾插入一个元素。
pop_back() 删除最后一个元素。
size() 返回当前元素的个数。
capacity() 返回当前分配的存储容量。
resize(size_t n) 调整容器大小。
deque push_front(const T& value) 在前端插入一个元素。
push_back(const T& value) 在末尾插入一个元素。
pop_front() 删除前端元素。
pop_back() 删除末尾元素。
list push_front(const T& value) 在前端插入一个元素。
push_back(const T& value) 在末尾插入一个元素。
pop_front() 删除前端元素。
pop_back() 删除末尾元素。
insert(iterator pos, const T& value) 在指定位置插入元素。
erase(iterator pos) 删除指定位置的元素。
stack push(const T& value) 压栈操作,在栈顶插入一个元素。
pop() 弹栈操作,移除栈顶元素。
top() 访问栈顶元素。
queue push(const T& value) 入队操作,在队尾插入一个元素。
pop() 出队操作,移除队首元素。
front() 访问队首元素。
back() 访问队尾元素。
priority_queue push(const T& value) 插入元素并维护堆结构。
pop() 删除优先级最高的元素。
top() 访问优先级最高的元素。
set insert(const T& value) 插入元素并保持有序。
erase(iterator pos) 删除指定元素。
find(const T& value) 查找指定元素。
begin() 获取指向第一个元素的迭代器。
end() 获取指向最后一个元素的迭代器。
map insert(const std::pair<Key, T>& value) 插入键值对。
erase(iterator pos) 删除指定元素。
find(const Key& key) 查找指定键的元素。
operator[](const Key& key) 访问或插入键值对。

结语

如果文章能够帮助到你,请给我一个肯定的赞

关注博主分享更多有用技术~

相关推荐
Re.不晚13 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会15 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香18 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??22 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色38 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
凌云行者1 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
凌云行者1 小时前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang