C++ STL 容器与算法详解
容器
序列容器
-
vector:动态数组,支持快速随机访问
- 特点:内存连续分配,末尾插入/删除高效
- 典型操作:push_back(), pop_back(), insert()
- 应用场景:需要随机访问且大小经常变化的序列
-
deque:双端队列,支持首尾高效插入/删除
- 特点:分段连续存储,两端操作高效
- 典型操作:push_front(), push_back(), pop_front()
- 应用场景:队列和栈的结合体,如滑动窗口
-
list:双向链表
- 特点:非连续存储,任意位置插入/删除高效
- 典型操作:splice(), merge(), sort()
- 应用场景:频繁在中间插入/删除的场景
关联容器
-
set:有序集合
- 特点:元素唯一,自动排序(默认升序)
- 典型操作:insert(), find(), lower_bound()
- 应用场景:需要维护有序且唯一的元素集合
-
map:键值对集合
- 特点:键唯一,按键排序
- 典型操作:operator[], find(), count()
- 应用场景:字典、哈希表替代(需要有序时)
无序关联容器
-
unordered_set:哈希集合
- 特点:元素唯一,基于哈希表实现
- 典型操作:insert(), find(), count()
- 应用场景:需要快速查找且不关心顺序
-
unordered_map:哈希映射
- 特点:键唯一,基于哈希表实现
- 典型操作:operator[], find(), count()
- 应用场景:需要快速键值查找且不关心顺序
容器适配器
-
stack:后进先出(LIFO)容器
- 底层实现:默认基于deque
- 典型操作:push(), pop(), top()
- 应用场景:函数调用栈、表达式求值
-
queue:先进先出(FIFO)容器
- 底层实现:默认基于deque
- 典型操作:push(), pop(), front()
- 应用场景:任务调度、BFS算法
-
priority_queue:优先队列
- 底层实现:默认基于vector
- 典型操作:push(), pop(), top()
- 应用场景:Dijkstra算法、任务优先级调度
算法
非修改序列算法
-
find:查找特定值
- 示例:
auto it = find(v.begin(), v.end(), 42); - 复杂度:O(n)
- 示例:
-
count:统计元素出现次数
- 示例:
int n = count(v.begin(), v.end(), value);
- 示例:
-
for_each:对每个元素应用函数
- 示例:
for_each(v.begin(), v.end(), [](int x){...});
- 示例:
-
count_if:条件统计
- 示例:
int n = count_if(v.begin(), v.end(), [](int x){return x>10;});
- 示例:
-
find_if:条件查找
- 示例:
auto it = find_if(v.begin(), v.end(), [](int x){return x%2==0;});
- 示例:
修改序列算法
-
copy:复制序列
- 示例:
copy(src.begin(), src.end(), dest.begin());
- 示例:
-
fill:填充序列
- 示例:
fill(v.begin(), v.end(), 0);
- 示例:
-
reverse:反转序列
- 示例:
reverse(v.begin(), v.end());
- 示例:
-
remove:移除特定元素
- 示例:
auto new_end = remove(v.begin(), v.end(), value);
- 示例:
-
unique:去除相邻重复元素
- 示例:
auto new_end = unique(v.begin(), v.end());
- 示例:
-
rotate:旋转序列
- 示例:
rotate(v.begin(), v.begin()+3, v.end());
- 示例:
排序与相关算法
-
sort:快速排序
- 示例:
sort(v.begin(), v.end()); - 复杂度:O(n log n)
- 示例:
-
binary_search:二分查找
- 示例:
bool found = binary_search(v.begin(), v.end(), value);
- 示例:
-
stable_sort:稳定排序
- 特点:保持相等元素的相对顺序
-
lower_bound:查找第一个不小于给定值的元素
- 示例:
auto it = lower_bound(v.begin(), v.end(), value);
- 示例:
-
upper_bound:查找第一个大于给定值的元素
- 示例:
auto it = upper_bound(v.begin(), v.end(), value);
- 示例:
-
next_permutation:生成下一个排列
- 示例:
while(next_permutation(v.begin(), v.end())){...}
- 示例:
数值算法
-
accumulate:累加
- 示例:
int sum = accumulate(v.begin(), v.end(), 0);
- 示例:
-
partial_sum:部分和
- 示例:
partial_sum(v.begin(), v.end(), output.begin());
- 示例:
集合算法
-
set_union:并集
- 示例:
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), output.begin());
- 示例:
-
set_intersection:交集
- 示例:
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), output.begin());
- 示例:
堆算法
-
make_heap:构建堆
- 示例:
make_heap(v.begin(), v.end());
- 示例:
-
push_heap:向堆中添加元素
- 示例:
v.push_back(value); push_heap(v.begin(), v.end());
- 示例:
-
pop_heap:从堆中移除元素
- 示例:
pop_heap(v.begin(), v.end()); v.pop_back();
- 示例:
洛谷习题推荐
容器相关
序列容器
- P3613:vector基本操作
- P1996:约瑟夫问题(list模拟)
- P1540:LRU缓存(deque/queue实现)
- P1177:排序(vector + sort)
关联容器
- P4325:set基本操作
- P1102:map应用(统计词频)
- P3156:unordered_map应用
- P2234:set + lower_bound/upper_bound
容器适配器
- P1090:priority_queue应用(合并果子)
- P4387:stack应用(表达式求值)
- P3378:priority_queue实现堆
算法相关
非修改序列算法
- P1469:count/for_each应用
- P2670:find_if/count_if应用
修改序列算法
- P1918:reverse应用
- P1202:fill/copy应用
排序与相关算法
- P1223:sort/stable_sort应用
- P1873:sort + lower_bound应用
- P1068:排序应用
堆算法
- P1090:make_heap/push_heap/pop_heap应用
- P1792:堆算法综合应用
