C++ :STL
STL(Standard Template Library)是 C++ 标准库的核心组成部分,提供了通用的模板类和函数,通过泛型编程来高效处理数据结构与算法。它由四大核心组件构成:
1. 容器(Containers)
用于管理数据集合,分为以下几类
序列容器
vector:动态数组,支持随机访问,尾部插入 / 删除效率高(均摊 O (1))。
list:双向链表,任意位置插入 / 删除 O (1),但不支持随机访问。
deque:双端队列,支持两端高效插入 / 删除(O (1)),随机访问 O (1)。
array:固定大小数组,替代原生数组,提供 STL 接口(如迭代器、size())。
forward_list:单向链表,内存占用更小,插入 / 删除效率略高于list。
关联容器
set/multiset:基于红黑树(平衡二叉搜索树),元素自动排序,set不允许重复,multiset允许。
map/multimap:键值对集合,基于红黑树,map键唯一,multimap键可重复。
unordered_set/unordered_multiset:基于哈希表,元素无序,查找、插入、删除平均 O (1)。
unordered_map/unordered_multimap:无序键值对,基于哈希表,性能同上。
容器适配器
stack:后进先出(LIFO),默认基于deque实现。
queue:先进先出(FIFO),默认基于deque实现。
priority_queue:优先队列,基于堆结构,默认最大堆(vector+less比较器)。
2. 迭代器(Iterators)
提供访问容器元素的统一接口,类似指针,支持:
输入 / 输出迭代器:单向读取 / 写入(如istream_iterator)。
前向迭代器:支持++(如forward_list的迭代器)。
双向迭代器:支持++和–(如list、set的迭代器)。
随机访问迭代器:支持跳跃访问(如vector、deque的迭代器)。
迭代器失效:当容器结构被修改(如插入 / 删除元素)导致迭代器指向的内存无效。例如:
vector在扩容或中间插入时,所有迭代器失效。
list删除元素时,仅被删除元素的迭代器失效。
3. 算法(Algorithms)
独立于容器的通用函数,通过迭代器操作数据,如:
排序:sort()、stable_sort()。
查找:find()、binary_search()。
修改:transform()、replace()。
数值计算:accumulate()、partial_sum()。
4. 函数对象(Function Objects)
重载()运算符的类或结构体,用于算法的自定义操作,例如:
greater()用于降序排序。
自定义谓词函数用于find_if()。
常见对比问题
map vs set
map:存储键值对(pair<const Key, T>),键唯一,基于红黑树或哈希表。
set:仅存储键,键唯一,基于红黑树或哈希表。
map vs unordered_map
push_back vs emplace_back
push_back:接受已构造的对象,可能触发拷贝 / 移动构造。
emplace_back:就地构造对象,直接传入参数,避免临时对象开销。