STL相关

sdxjzsq

2020-03-09 21:13:07

Personal

(由[我的hexo博客](http://www.xjdesyxx.top/2020/02/26/stl/)搬运并同步维护) 最近每次打比赛用到STL的时候都想去查查,来防止写错,因此浪费了大量的时间,遂决定写篇博客,到时候直接在博客查阅。 ## queue 队列 ### methods in code ```cpp #include<stdio.h> #include<queue> struct node{int x,y;}; std::queue<node> Q; int main() { Q.push((node){1,1}),Q.push((node){2,2}); printf("size:%d\n",Q.size());//=>size:2 printf("队首x元素:%d\n队尾x元素:%d\n",Q.front().x,Q.back().x); //=>队首x元素:1 //=>队尾x元素:2 while(!Q.empty())Q.pop(); return 0; } ``` ## priority_queue 优先队列 `priority_queue` 默认是大根堆(降序队列),也就是 `priority_queue<T,vector<T>,less<T>>` 类型,要定义小根堆,则需要使用 `priority_queue<T,vector<T>,greater<T>>` 来定义,要注意的一点是,使用 `greater<T>` 时必须重载 `>` 而不是 `<` (自定义类型就老老实实倒着重载小于号就行了,重载大于号再用greater属于是自找麻烦)。 ```cpp #include <cstdio> #include <queue> using namespace std; struct node { int a, b, c; node(int a, int b, int c) { a = a, b = b, c = c; } // 自定义类型使用emplace必须定义构造函数 bool operator<(const node &other) const { return a < other.a; } }; priority_queue<node> Q, P; int main() { Q.emplace(1, 2, 3); // emplace 插入必须有构造函数,直接按顺序写参数即可。 Q.push({2, 3, 1}); // 比 emplace 多一次构造 Q.top(); // 访问队头元素 Q.size(); // 返回队列内元素个数 Q.pop(); // 弹出队头元素 Q.swap(P); // 交换 P、Q 中的内容 } ``` ## vector向量 声明: ```cpp vector<T> vec; ``` 获取最后一个元素 ```cpp vec.back(); vec.end()-1; vec.rbegin(); vec.at(vec.size()-1) ``` ## string 字符串 见洛谷博客:https://www.luogu.com.cn/blog/xjzsq/stlstring-zi-fu-chuan ## pair ``` cpp #include<cstdio> #include<algorithm>//iostream也可 using namespace std; int main() { pair<int,int> x,y;//珂以是任意类型复合(包括pair套pair,例子见下方) x=make_pair(2,1),y=x;//支持make_pair和变量间赋值 printf("%d,%d\n",x.first,x.second); pair<pair<int,int>,int> z(make_pair(1,2),3);//珂以在定义时跟括号赋初值 printf("%d %d %d\n",z.first.first,z.first.second,z.second); } ``` ## map 映射 ### 部分方法 - 建立 ``` cpp map<type,type> M; ``` - 插入 ``` cpp M.insert(pair<type,type>(par1,par2)); ``` - 查找元素 ```cpp int a=M.count(par);//只能返回0(不存在)/1(存在) map<int,int>::iterator iter=M.find(par); //珂以返回元素所在的位置的迭代器 //之后你就可以这么写: cout<<iter->first<<"->"<<iter->second<<endl; ``` - 获取元素 ```cpp cout<<M[par1];//珂以输出par2 //或者珂以使用迭代器 for(map<type,type>::iterator iter=M.begin();iter!=M.end();iter++) cout<<iter->first<<"->"<<iter->second<<endl; //然后就珂以顺序输出每一组par1->par2 //当然也珂以对元素赋值: M[par1]=par2; ``` ## lower_bound/upper_bound ### 原理与使用 内部由二分实现,其实就是二分查找,操作对象必须是有序数组。 lower_bound(g+1,g+n+1,val)-g是返回g[1..n]中第一个大于等于val的值的位置,而upper_bound(g+1,g+n+1,val)-g是返回g[1..n]中第一个大于val的值的位置。 ### 应用举例 1. 查找数组中 $a[i]\in[x,y]$ 的元素个数:`upper_bound(a+1,a+n+1,y)-lower_bound(a+1,a+n+1,x);` 2. 实现某些需要对有序数组进行二分查找的操作:[P1020 【导弹拦截】](https://www.luogu.com.cn/blog/xjzsq/p1020) ## set/multiset ### 咕咕咕 ### 在写了在写了