STL——c++偷懒妙招
dingziyang888 · · 算法·理论
更新日志
- 2025/9/19 14:30 更新至
vector - 2025/9/19 16:30 更新至
queue - 2025/9/19 19:25 更新至
daaeque - 2025/9/19 22:05 更新至
priority_queue并修改了部分内容 - 2025/9/20 21:51 更新至
set - 2025/9/22 22:25 更新至
map并修改了部分内容前言
在写数据结构的时候,大部分的插入删除写起来都十分复杂,那么今天蒟蒻就来讲一讲
STL的部分容器。
iterator
简介
iterator 是 STL 中的首要内容,意为“迭代器”,建立一个 iterator 可以遍历一个支持遍历的 STL 容器,它就像一个指针,访问当前的元素时像指针一样在前面加星号就可以了。
特别地,
- 对于
map,访问键值用it->first,访问具体值时用it->second。 - 对于以结构体为元素的容器,访问元素
a 用it->a即可
定义方法:vector <int>::iterator it;也可以:
auto it;实例
以遍历一个
vector <int> v为例:for (vector <int>::iterator it = v.begin(); it != v.end(); it++) printf("%d\n", *it);也可以
for (auto it = v.begin(); it != v.end(); it++) printf("%d\n", *it);vector
简介
平时我们开数组,最多大小只能开到
INT_MAX(int 数组),而vector就能解决空间的问题,可以在添加元素的时候动态地增加数组大小。
访第i 个元素时,和数组一样,用[]访问即可。
定义方法vector <类型名> 变量名;函数
以下是一些常用函数:
front():返回对第一个元素的引用;back():返回对最后一个元素的引用;clear():清空vector;empty():判断是否为空;begin():返回一个迭代器,指向第一个元素;end():返回一个迭代器,指向最后一个元素的下一个位置;rbegin():返回逆向一个迭代器,指向最后一个元素;rend():返回逆向一个迭代器,指第一个元素的前一个位置;pop_back():删除vector的最后一个元素;push_back(value):将value 放到vector的最后;size():返回vector中元素的个数;erase(it):删除it迭代器指向的位置,返回下一元素迭代器;erase(first,last):删除[first,last)区间内的元素,返回last迭代器;insert(it,value):将value 插入迭代器it指向的位置,并返回其迭代器;insert(it,num,value):将num 个value 插入迭代器it指向的位置;insert(it,first,last):将区间[first,last)内的元素插入迭代器it指向的位置。实例
一个
vector的应用:P2853 Cow Picnic,有兴趣的读者可以自行尝试。
stack
简介
数据结构——栈,一般方法是用数组模拟,stack 可以帮我们实现。
定义方法:
stack <类型名> 变量名;
函数
下面是一些常用函数:
empty():判断是否为空;pop():移除栈顶元素;push(value):value 入栈;size():返回栈中元素个数;top():引用栈顶元素。实例
经典应用:P1449 后缀表达式;
拓展:P1175,P10473。
queue
简介
我们在广搜(广度优先搜索,breadth first search,简称 bfs)中需要用数据结构——队列来实现,队列一般用数组模拟, queue 也可以帮我们实现。
定义方法:
queue <类型名> 变量名;
函数
下面是一些常用函数:
empty():判断是否为空;pop():移除队首元素;push(value):value 从队尾入队;size():返回队列中元素个数;front():返回队首元素的引用;back():返回队尾元素的引用。实例
广搜题都可以用
queue来实现,例如 P1135 奇怪的电梯;deque
简介
上面我们介绍了
queue,是一个单端队列,而deque是一个双端队列,功能更加强大。
定义方法:deque <类型名> 变量名;函数
下面是一些常用函数:
front():返回第一个元素的引用;back():返回最后一个元素的引用;begin():返回指向第一个元素的迭代器;end():返回指向最后一个元素下一个位置的迭代器;rbegin():返回指向后一个元素的逆向迭代器;rend():返回指向第一个元素前一个位置的逆向迭代器;empty():判断队列是否为空;size():返回deque中的元素个数;clear():清空deque中的所有元素;insert(it, value):在迭代器it指向的位置插入value ;erase(it):删除迭代器it指向的元素;push_back(value):在deque末尾添加元素value ;pop_back():移除deque末尾的元素;push_front(value):在deque前端添加元素value ;pop_front():删除deque前端的元素;resize(conut):重新构造一个长度为count 的deque,多出部分用默认值填充。实例
有一些用
queue的题可以用deque来优化,有兴趣的读者可以自行尝试。
priority_queue
简介
priority_queue 被称为优先队列,可以实现堆结构。
定义格式:
priority_queue <类型名> 变量名;
priority_queue 默认是大根堆,而小根堆的定义格式为:
priority_queue <int, vector<int>, greater<int> >a;
如果用结构体 node 来作为堆的元素,则要重载运算符,例如:
struct node{
int a, b;
bool operator<(const node&X)const{
if (a != X.a)
return a < X.a;
return b < X.b;
}
};
函数
以下是一些常用函数:
empty():判断是否为空;pop():移除优先级最高的元素;push(value):value 入队;size():返回priority_queue中元素个数;top():返回优先级最高元素的引用;实例
一个简单的应用:P1090 合并果子。
set
简介
在数学中,集合指没有重复元素的集,而
STL中的set可以帮我们实现这一内容,定义方法:set <类型名> 变量名:函数
下面是一些常用函数:
begin():返回一个迭代器,指向第一个元素;end():返回一个迭代器,指向最后一个元素的下一个位置;insert(value):value 插入set;find(value):在set中查找value ,找到指向value 的迭代器,否则返回end();erase(it):删除迭代器it指向的位置;erase(value):删除value ;erase(first,last):删除[first,last)内的元素;empty():判断是否为空;size();返回set中元素个数;clear():清空set中的所有元素;lower_bound(value):返回一个迭代器,指向第一个\ge value 的元素所在位置;upper_bound(value):返回一个迭代器,指向第一个> value 的元素所在位置。实例
一个应用:P2234 营业额统计,有兴趣的读者可以自行尝试。
拓展
set指的是没有重复元素的集合,而可重集则需要用multiset来实现,除了上面有的函数,multiset还有一个函数:count(value):返回值为value 的元素个数。map
简介
map被称为映射,它的功能与set十分相似,区别在于map操作的对象不是单个,而是对组pair 。简单来说,就是操作一个包含两个元素的结构体,第一个元素称为first (表示键值key ),第二个元素称为second (表示值value ),描述从key 到value 的一个映射。事实上,set也可以看作是key 与value 相等的一个映射。
定义方法:map <类型名,类型名> 变量名;函数
下面是一些常用函数:
begin():返回一个迭代器指向第一个元素;end():返回一个迭代器指向最后一个元素的下一个位置;insert(pair):pair插入map;find(x):map中查找key 为x 的元素,找到返回指向x 的迭代器,否则返回end();erase(it):删除迭代器it指向的位置;erase(x):删除键值key 为x 的元素;erase(first,last):删除键值在区间[first,last)内的元素;empty():判断是否为空;size():返回map中元素个数;clear():清空map中所有元素;lower_bound():返回一个迭代器,指向第一个键值key \ge x 的元素所在位置;upper_bound():返回一个迭代器,指向第一个键值key>x 的元素所在位置。实例
map的适用范围很广,很多桶排序都可以用map实现,包括很多统计的题,有兴趣的读者可以自行尝试。后记
实在不知道写什么