C++复习——STL容器操作
C++ STL为使用者提供了一系列类模版,使用者在使用时,可以根据自己需要的数据类型将STL中的类模版实例化为自己所需类型。因此这些操作被称为STL容器操作,以下主要整理了一些做题中常用到的操作。
从数据的存储方式和允许的操作上来看,容器分类主要有:
- 序列式容器
- 关联式容器
- 无序关联容器
- 容器适配器

(图像来源于https://oi-wiki.org/lang/csl/container/)
关于迭代器
迭代器是STL中容器共同支持的操作,其功能类似于指针。虽然对于顺序容器,使用下标进行操作可能更为直观,但是很多STL中的函数都使用迭代器作为输入参数/返回参数,因此有必要针对常用STL函数了解迭代器使用。
以下是几个较为常用的STL函数,适当使用会便于写程序和计算:
- sort(v.begin(), v.end(), cmp)
- find(v.begin(), v.end(), value) 返回对应迭代器
- binary_search(v.begin(), v.end(), value) 返回true/false
- merge(v1.begin(), v1.end(), v2.begin(), v2.end()) 合并两个有序序列
- lower_bound/upper_bound(v.begin(),v.end(),x) 必须有序序列,返回指向第一个大于等于/大于x的位置的迭代器。如果不存在这样的元素,则返回尾迭代器。原理是利用二分查找
- unique()相邻元素的去重,返回去重后结尾的迭代器,原容器大小不变,应该是采用交换到最后的办法
序列式容器
vector
- front()/back()返回元素引用
- insert()插入元素,复杂度线性
- push_back()/pop_back()
deque
- push_back()/pop_back()
- push_front()/pop_front()
list
双向链表
- front()/back()返回引用
- push_back()/pop_back()
- push_front()/pop_front()
- insert()
- merge()有序合并
关联式/无序关联容器
set
- insert()
- count()统计出现个数
- find()返回迭代器
map
- 可以通过直接赋值或者pair插入,也可以通过一个{}表插入
- find()返回迭代器(指向pair)
unordered_set
可能需要自定义hash函数:
struct my_hash { size_t operator()(int x) const { return x; } };
- count()统计出现个数,在无序容器中只能为0或者1
- erase()删除
unordered_map
需要注意插入操作,map对应的是pair,因此需要make_pair或者直接赋值的方法插入
容器适配器
容器适配器不支持迭代器操作。
stack
- top()
- push()/pop()
queue
- front()
- push()/pop()
priority_queue
也属于<queue>头文件,可能要自定义优先级,默认是大根堆less<int>
struct cmp { bool operator()(Node a, Node b) { return a.x>b.x; } };
- priority_queue<int, vector<int>, greater<int> >p;修改成小根堆
- top()
- pop()删除第一个元素

浙公网安备 33010602011771号