找回密码
 立即注册
首页 业界区 业界 STL 容器

STL 容器

喳谍 2025-6-24 20:26:03
C++ STL(Standard Template Library)中主要提供了三大类通用容器,用于存储和管理不同类型和结构的数据。它们分别是:
STL 容器总览

[tr]容器类别容器说明[/tr]
序列式容器 (Sequence Containers)vector, deque, list, forward_list, array元素按插入顺序排列,类似数组
关联式容器 (Associative Containers)set, map, multiset, multimap自动排序,基于平衡树(红黑树)
无序关联容器 (Unordered Associative Containers)unordered_set, unordered_map, unordered_multiset, unordered_multimap无序哈希表,查找插入效率高
容器适配器 (Container Adapters)stack, queue, priority_queue封装其他容器,提供特定行为
序列式容器(有顺序,按位置存储)

[tr]容器名特点常见用途[/tr]
vector动态数组,支持随机访问,尾部插入快默认首选容器,替代 C 数组
deque双端队列,支持首尾插入删除双端栈、滚动窗口
list双向链表,插入删除快,不能随机访问频繁插入/删除位置稳定
forward_list单向链表,内存更小(C++11)内嵌链表、只需前向遍历
array定长数组,封装 C 风格数组(C++11)栈上存储,性能好,长度固定
一、序列式容器特性对比速查表

[tr]特性维度vectorarraydequelistforward_list[/tr]
底层结构动态数组(连续内存)静态数组(连续内存)分段数组双向链表单向链表
大小可变✅ 是❌ 否✅ 是✅ 是✅ 是(无 size())
下标访问 ([], at())✅ 支持✅ 支持✅ 支持❌ 不支持❌ 不支持
头部操作 (push_front)❌ 慢(需移动)✅ 高效✅ 高效✅ 高效
尾部操作 (push_back)✅ 高效✅ 高效✅ 高效❌ 无此接口
中间插入/删除❌ 慢(移动元素)⚠️ 中等偏慢✅ 高效✅ 但不方便
空间管理函数✅ reserve()、shrink_to_fit()
支持 data()✅(C++17 起)
支持 size()❌(需手动计数)
迭代器类型随机访问随机访问随机访问双向单向(forward only)
STL算法兼容性✅ 全兼容✅ 全兼容✅ 全兼容⚠️ 不能用 std::sort()同左
稳定性(指针/引用稳定)❌ 增删会失效✅ 稳定✅ 稳定
排序支持std::sort()std::sort()std::sort().sort()(成员函数).sort()
内存分配位置堆(分段)堆(节点)堆(节点)
适用场景随机访问、连续优化、频繁尾部插入定长数组替代品、轻量双端队列、滑动窗口频繁中间修改单向处理流、大量前插、轻量链表
deque 内存分块不支持空间管理函数,vector 是一片连续的内存,支持 data()、reserve()、shrink_to_fit() 等内存操作;
list 和forward_list内部结构是链表,没有下标操作,链表自带排序api;
array 在编译时就确定了大小,不能动态改变元素的数量,内存分配在栈上;
  • vector:适合连续内存优化,支持 data()、reserve()、shrink_to_fit() 等内存操作,尾部插入效率高,但头部和中间插入较慢。
  • array:固定大小的轻量容器,栈上分配,支持下标访问和 data(),不支持任何动态操作。
  • deque:支持头部和尾部插入操作,适合双端队列场景,但不支持空间管理函数,底层为分段内存结构。
  • list:双向链表容器,适合频繁的中间插入和删除,元素地址稳定,但不支持下标访问,也不能用 std::sort()(需要用成员 sort())。
  • forward_list:单向链表容器,接口更轻量,不支持尾部插入和 size(),只能使用 insert_after() / erase_after() 等后置操作,适合嵌入式或轻量场景。
二、共性 API 总结

几乎所有序列式容器都支持如下操作(但有些容器支持受限):
[tr]类别API说明[/tr]
容器大小size()返回当前元素个数
empty()是否为空
max_size()可容纳最大元素数
元素访问front() / back()返回头/尾元素(不能用于 forward_list 的 back())
迭代器begin() / end()常规迭代器
cbegin() / cend()const 版本
rbegin() / rend()反向迭代器
修改操作insert()插入元素(forward_list 仅支持 after)
erase()删除元素(forward_list 仅支持 after)
push_back() / pop_back()尾部插入/删除(forward_list 无)
push_front() / pop_front()头部插入/删除(vector 无)
clear()清空容器
resize()改变大小
其他swap()交换两个容器
assign()批量赋值(如指定区间或重复值)
二、每个容器详细 API + 特性对比

1. vector

  1. #include <vector>
复制代码

  • std::vector 是一个动态数组容器
  • 元素连续存储,支持随机访问
  • 尾部插入/删除效率高,插入中间位置效率较低
std::vector 的常用构造函数构造函数

[tr]构造函数说明[/tr]
vector()默认构造,空容器
vector(size_t n)创建含 n 个默认值元素的容器
vector(size_t n, const T& val)创建含 n 个值为 val 的元素
vector(initializer_list)使用花括号初始化列表构造(C++11)
vector(iter1, iter2)通过迭代器区间构造
vector(const vector& other)拷贝构造
vector(vector&& other)移动构造(C++11)
具体例子:
[tr]构造方式示例说明[/tr]
默认构造vector v;创建空容器
指定大小vector v(5);创建 5 个默认元素(0)
指定大小和值vector v(3, 9);创建 3 个值为 9 的元素
初始化列表vector v = {1, 2};推荐用法,清晰直观
区间构造vector v(v2.begin(), v2.end());从其他容器复制子区间
拷贝构造vector v(v2);拷贝另一个 vector
移动构造vector v(std::move(v2));高效转移所有权(C++11)
示例代码:
[code]#include <vector>#include <vector>int main() {    // 1. 默认构造    std::vector v1;    std::cout

相关推荐

您需要登录后才可以回帖 登录 | 立即注册