STL 容器
STL 容器
STL 容器
STL(Standard Template Library)是C++标准库的重要组成部分,提供了一系列高效的数据结构和算法实现。
序列式容器
vector(动态数组)
常用函数
push_back(element):在末尾添加元素pop_back():删除最后一个元素size():返回元素个数capacity():返回当前容量empty():判断是否为空clear():清空所有元素at(index):访问指定位置元素(带边界检查)operator[]:访问指定位置元素(不带边界检查)front():访问第一个元素back():访问最后一个元素begin()/end():返回迭代器insert(pos, element):在指定位置插入元素erase(pos):删除指定位置元素
注意事项
- 在尾部插入和删除效率高(O(1))
- 在中间或头部插入/删除效率较低(O(n))
- 自动扩容,但可能导致内存重新分配
1
2
3
4
5
#include <vector>
std::vector<int> vec = {1, 2, 3};
vec.push_back(4); // 添加元素
vec.pop_back(); // 删除最后一个元素
int size = vec.size(); // 获取大小
queue(队列)
常用函数
push(element):在队尾添加元素pop():删除队首元素front():访问队首元素back():访问队尾元素empty():判断队列是否为空size():返回队列中元素个数
注意事项
- 遵循先进先出(FIFO)原则
- 只能访问队首和队尾元素
- 不能使用迭代器遍历
1
2
3
4
5
6
7
#include <queue>
std::queue<int> q;
q.push(1); // 入队
q.push(2);
q.push(3);
int front = q.front(); // 访问队首元素
q.pop(); // 出队
list(双向链表)
常用函数
push_front(element):在头部插入元素push_back(element):在尾部插入元素pop_front():删除头部元素pop_back():删除尾部元素insert(pos, element):在指定位置插入元素erase(pos):删除指定位置元素remove(value):删除所有等于value的元素unique():删除相邻重复元素sort():排序merge(other_list):合并两个已排序列表reverse():反转
注意事项
- 不支持随机访问,只能通过迭代器遍历
- 插入和删除操作效率高(O(1))
- 内存开销较大(每个节点需要额外指针)
1
2
3
4
5
#include <list>
std::list<int> lst = {1, 2, 3};
lst.push_back(4);
lst.remove(2); // 删除值为2的元素
lst.sort(); // 排序
关联式容器
set(集合)
常用函数
insert(element):插入元素erase(element):删除元素find(element):查找元素count(element):统计元素个数(0或1)size():返回元素个数empty():判断是否为空clear():清空所有元素begin()/end():返回迭代器
注意事项
- 元素唯一且自动排序
- 查找、插入、删除时间复杂度为O(log n)
- 默认使用<运算符比较元素
1
2
3
4
5
6
#include <set>
std::set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
// s中元素顺序为: 1, 2, 3
multiset(多重集合)
常用函数
- 与set相同,但允许重复元素
注意事项
- 允许存储多个相同值的元素
- 其他特性与set相似
map(映射)
常用函数
operator[key]:访问或插入键值对insert(pair<key,value>):插入键值对erase(key):删除指定键find(key):查找键count(key):统计键个数(0或1)size():返回键值对个数empty():判断是否为空clear():清空所有键值对
注意事项
- 键唯一且自动按键排序
- 值可以重复
- 访问不存在的键会创建该键并赋予默认值
1
2
3
4
5
#include <map>
std::map<std::string, int> m;
m["apple"] = 5;
m["banana"] = 3;
int apple_count = m["apple"]; // 获取值
multimap(多重映射)
常用函数
- 与map类似,但允许重复键
注意事项
- 允许一个键对应多个值
- 其他特性与map相似
无序容器(C++11)
unordered_set(无序集合)
常用函数
- 与set类似,但基于哈希表实现
注意事项
- 元素不排序
- 平均查找、插入、删除时间复杂度为O(1)
- 最坏情况下为O(n)
unordered_map(无序映射)
常用函数
- 与map类似,但基于哈希表实现
注意事项
- 键值对不排序
- 平均查找、插入、删除时间复杂度为O(1)
- 最坏情况下为O(n)
通用注意事项
- 使用前需包含相应头文件
- 所有STL容器都不是线程安全的
- 迭代器失效问题需要注意:
- vector在插入新元素导致重新分配内存时会使所有迭代器失效
- deque在中间插入/删除可能使迭代器失效
- list的迭代器相对稳定,只有在删除元素时对应迭代器失效
- 容器的拷贝操作可能代价较高,考虑使用引用或指针
- 根据使用场景选择合适的容器类型
本文由作者按照 CC BY 4.0 进行授权