C++STL十大容器全面解析
C++ STL容器详解(十种常用容器)
C++ 标准模板库(STL)提供了一系列高效的数据结构容器,用于存储和管理数据。这些容器分为顺序容器、关联容器和容器适配器。以下将详细介绍十种常用容器:vector、list、deque、stack、queue、priority_queue、set、multiset、map 和 multimap。每个容器的介绍包括特性、时间复杂度、使用场景和代码示例。
1. vector(向量)
vector 是一个动态数组,支持随机访问。它在内存中是连续的,允许在尾部高效插入和删除元素。
- 特性:顺序容器,可动态调整大小。
- 时间复杂度:
- 随机访问:$O(1)$
- 尾部插入/删除:$O(1)$(平均情况)
- 中间插入/删除:$O(n)$
- 使用场景:需要随机访问的场景,如数组替代品。
- 代码示例:
#include
#include
int main() {
std::vector vec = {1, 2, 3}; // 初始化
vec.push_back(4); // 尾部插入,O(1)
std::cout << vec[0] << std::endl; // 随机访问,O(1)
return 0;
}
http://my.tv.sohu.com/us/442092364/698194031.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDAzMS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698193974.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5Mzk3NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698193975.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5Mzk3NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194127.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDEyNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194140.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE0MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194146.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194074.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194075.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194165.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE2NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194078.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194181.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE4MS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194190.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194332.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDMzMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194343.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM0My5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194360.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM2MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194363.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM2My5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194448.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ0OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194602.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYwMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194459.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ1OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194612.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYxMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194466.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ2Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194390.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194617.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYxNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194486.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194638.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYzOC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194802.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDgwMi5zaHRtbA==.html
2. list(双向链表)
list 是一个双向链表,支持在任意位置高效插入和删除元素,但不支持随机访问。
- 特性:顺序容器,元素不连续存储。
- 时间复杂度:
- 插入/删除任意位置:$O(1)$(如果已知迭代器)
- 随机访问:$O(n)$
- 使用场景:需要频繁在中间插入或删除元素的场景。
- 代码示例:
#include
#include
int main() {
std::list lst = {1, 2, 3}; // 初始化
auto it = lst.begin();
++it;
lst.insert(it, 4); // 在位置插入,O(1)
for (int n : lst) std::cout << n << " "; // 遍历
return 0;
}
3. deque(双端队列)
deque 是一个双端队列,支持在头部和尾部高效插入和删除元素,同时支持随机访问。
- 特性:顺序容器,分段连续存储。
- 时间复杂度:
- 头部/尾部插入/删除:$O(1)$
- 随机访问:$O(1)$
- 使用场景:需要频繁在两端操作元素的场景,如队列和栈的组合。
- 代码示例:
#include
#include
int main() {
std::deque dq = {1, 2, 3}; // 初始化
dq.push_front(0); // 头部插入,O(1)
dq.push_back(4); // 尾部插入,O(1)
std::cout << dq[1] << std::endl; // 随机访问,O(1)
return 0;
}
http://my.tv.sohu.com/us/442092364/698194031.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDAzMS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698193974.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5Mzk3NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698193975.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5Mzk3NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194127.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDEyNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194140.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE0MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194146.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194074.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194075.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194165.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE2NS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194078.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDA3OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194181.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE4MS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194190.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDE5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194332.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDMzMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194343.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM0My5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194360.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM2MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194363.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM2My5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194448.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ0OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194602.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYwMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194459.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ1OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194612.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYxMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194466.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ2Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194390.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDM5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194617.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYxNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194486.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDQ4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194638.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDYzOC5zaHRtbA==.html
http://my.tv.sohu.com/us/442092364/698194802.shtml
https://tv.sohu.com/v/dXMvNDQyMDkyMzY0LzY5ODE5NDgwMi5zaHRtbA==.html
4. stack(栈)
stack 是一个容器适配器,基于其他容器(如 deque 或 list)实现后进先出(LIFO)操作。
- 特性:容器适配器,只允许在顶部插入和删除。
- 时间复杂度:
- 插入(push):$O(1)$
- 删除(pop):$O(1)$
- 使用场景:需要 LIFO 行为的场景,如函数调用栈。
- 代码示例:
#include
#include
int main() {
std::stack st;
st.push(1); // 压栈,O(1)
st.push(2);
std::cout << st.top() << std::endl; // 查看栈顶,O(1)
st.pop(); // 出栈,O(1)
return 0;
}
5. queue(队列)
queue 是一个容器适配器,基于其他容器(如 deque)实现先进先出(FIFO)操作。
- 特性:容器适配器,只允许在尾部插入和头部删除。
- 时间复杂度:
- 插入(push):$O(1)$
- 删除(pop):$O(1)$
- 使用场景:需要 FIFO 行为的场景,如任务调度。
- 代码示例:
#include
#include
int main() {
std::queue q;
q.push(1); // 入队,O(1)
q.push(2);
std::cout << q.front() << std::endl; // 查看队头,O(1)
q.pop(); // 出队,O(1)
return 0;
}
6. priority_queue(优先队列)
priority_queue 是一个容器适配器,基于堆实现,元素按优先级排序(默认最大堆)。
- 特性:容器适配器,元素有序。
- 时间复杂度:
- 插入(push):$O(log n)$
- 删除(pop):$O(log n)$
- 访问顶部元素:$O(1)$
- 使用场景:需要快速访问最大或最小元素的场景,如 Dijkstra 算法。
- 代码示例:
#include
#include
int main() {
std::priority_queue pq; // 默认最大堆
pq.push(3); // 插入,O(log n)
pq.push(1);
pq.push(2);
std::cout << pq.top() << std::endl; // 顶部元素,O(1)
pq.pop(); // 删除顶部,O(log n)
return 0;
}
7. set(集合)
set 是一个关联容器,存储唯一元素,基于红黑树实现,元素自动排序。
- 特性:关联容器,元素唯一且有序。
- 时间复杂度:
- 插入/删除:$O(log n)$
- 查找:$O(log n)$
- 使用场景:需要唯一元素和快速查找的场景。
- 代码示例:
#include
#include
int main() {
std::set s;
s.insert(3); // 插入,O(log n)
s.insert(1);
s.insert(2);
if (s.find(2) != s.end()) std::cout << "Found" << std::endl; // 查找,O(log n)
return 0;
}
8. multiset(多重集合)
multiset 类似于 set,但允许重复元素。
- 特性:关联容器,元素可重复且有序。
- 时间复杂度:
- 插入/删除:$O(log n)$
- 查找:$O(log n)$
- 使用场景:需要重复元素和排序的场景。
- 代码示例:
#include
#include
int main() {
std::multiset ms;
ms.insert(1); // 插入,O(log n)
ms.insert(1); // 允许重复
std::cout << ms.count(1) << std::endl; // 计数,O(log n)
return 0;
}
9. map(映射)
map 是一个关联容器,存储键值对,键唯一且有序,基于红黑树实现。
- 特性:关联容器,键唯一,支持通过键访问值。
- 时间复杂度:
- 插入/删除:$O(log n)$
- 查找:$O(log n)$
- 使用场景:需要键值对映射的场景,如字典。
- 代码示例:
#include
10. multimap(多重映射)
multimap 类似于 map,但允许重复键。
- 特性:关联容器,键可重复且有序。
- 时间复杂度:
- 插入/删除:$O(log n)$
- 查找:$O(log n)$
- 使用场景:需要一键多值的场景。
- 代码示例:
#include
总结
STL容器提供了高效的数据管理方案:
- 顺序容器:vector、list、deque 支持灵活的元素访问。
- 容器适配器:stack、queue、priority_queue 基于其他容器实现特定行为。
- 关联容器:set、multiset、map、multimap 提供有序存储和快速查找。
选择合适的容器取决于具体需求,如随机访问、插入频率或元素唯一性。使用这些容器时,注意时间复杂度以优化性能。C++ STL 的完整实现可参考标准库文档。
本文地址:https://www.yitenyun.com/5126.html






