在C++标准模板库(STL)中,vector、list和queue是最常用的几种容器。它们分别代表了动态数组、双向链表和队列适配器,适用于不同的数据操作场景。理解它们的底层结构和接口差异,是写出高性能代码的基础。

一、vector向量的使用
vector是一个连续存储的动态数组,支持通过下标进行随机访问,尾插和尾删的效率很高,但中间插入或删除需要移动元素。
常用操作
- push_back:在尾部添加元素
- pop_back:删除尾部元素
- size:获取元素个数
- operator[]:随机访问
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
v.push_back(10);
v.push_back(20);
// 随机访问第二个元素
std::cout << v[1] << std::endl;
v.pop_back();
std::cout << "size=" << v.size() << std::endl;
return 0;
}
二、list列表的使用
list是双向链表,每个节点保存前后指针。它在任意位置插入和删除都只需修改指针,不需要移动数据,但不支持随机访问,只能顺序遍历。
常用操作
- push_front / push_back:头尾插入
- insert:在迭代器位置插入
- erase:删除指定节点
#include <iostream>
#include <list>
int main() {
std::list<int> l;
l.push_back(1);
l.push_front(0);
// 在第二个位置插入5
auto it = l.begin();
++it;
l.insert(it, 5);
for (int x : l) {
std::cout << x << " ";
}
return 0;
}
三、queue队列的使用
queue是容器适配器,默认基于deque实现,提供先进先出(FIFO)的访问方式。它只允许在队尾入队、队头出队,不能遍历中间元素。
常用操作
- push:入队
- pop:出队
- front:访问队头
- back:访问队尾
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
q.push(3);
q.push(7);
std::cout << "front=" << q.front() << std::endl;
q.pop();
std::cout << "front=" << q.front() << std::endl;
return 0;
}
四、三者对比与选择建议
在实际开发中,可以根据操作特征来选型:
| 容器 | 随机访问 | 中间插入删除 | 典型场景 |
|---|---|---|---|
| vector | 快 | 慢 | 数据量稳定、多查询 |
| list | 无 | 快 | 频繁增删、少查询 |
| queue | 仅队头队尾 | 不支持 | 任务调度、缓冲 |
如果不确定用哪个,优先选vector,在性能瓶颈处再考虑list或queue。注意代码中用到如<vector>这类头文件标签时,应在正文里写成转义形式以避免被解析为实际标签。