前言:一点都不会stl,在一年前的浙大校赛上就因为不会stl折戟成沙,最近的wannafly的比赛上也有一道题是要用set的去重性的,只能交给队友去写,最最重要的一点来了,最近的一场CF 比赛 D题要用bitset,我不会就掉分了!!!
1.29
1.set没有重复元素,multiset可以有重复元素。(补题)
2.vector
vector<int> a ; //声明一个int型向量a
vector<int> a(10) ; //声明一个初始大小为10的向量
vector<int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
插入 - insert
①、 a.insert(a.begin(), 1000); //将1000插入到向量a的起始位置前
②、 a.insert(a.begin(), 3, 1000) ; //将1000分别插入到向量元素位置的0-2处(共3个元素)
③、 vector<int> a(5, 1) ;
vector<int> b(10) ;
b.insert(b.begin(), a.begin(), a.end()) ; //将a.begin(), a.end()之间的全部元素插入到b.begin()前
删除 - erase
①、 b.erase(b.begin()) ; //将起始位置的元素删除
②、 b.erase(b.begin(), b.begin()+3) ; //将(b.begin(), b.begin()+3)之间的元素删除
交换 - swap
b.swap(a) ; //a向量与b向量进行交换
vector< vector<int> > b(10, vector<int>(5)); //创建一个10*5的int型二维向量
运用:
for(int i=0;i<b.size();i++)
for(int j=0;j<b[i].size();j++)
printf("%d\n",b[i][j]);
注:vector resize() 和reverse()的区别
3.map的用法:
#include<bits\stdc++.h>
using namespace std;
int main()
{
int t,m;
scanf("%d",&t);
while(t--)
{
map<string,map<string,int> > mp;
char place[100],name[100];
int num;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%s%s%d",name,place,&num);
mp[place][name]+=num;
}
for(map<string,map<string,int> >::iterator iter1=mp.begin();iter1!=mp.end();iter1++)
{
cout<<iter1->first<<endl;
for(map<string,int>::iterator iter2=iter1->second.begin();iter2!=iter1->second.end();iter2++)
cout << " |----" << iter2->first << "(" << iter2->second << ")" <<endl;
}
if(t) printf("\n");
}
}
4.优先队列
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100;
struct node//定义结构体
{
int a;
int b;
bool operator < (node tmp)const//重载运算符函数
{
if(a==tmp.a)
return b<tmp.b;//注意运算符的开口方向,此处为按照b的升序排序(从小到大)
return a>tmp.a;//按照a的降序排序(从大到小)
}
}e[maxn];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>e[i].a>>e[i].b;
sort(e+1,e+n+1);//排序,因为已经重载了运算符,所以不用再写比较函数
for(int i=1;i<=n;i++)
cout<<e[i].a<<" ";
return 0;
}
#include<bits/stdc++.h>
#include<queue>
using namespace std;
struct H{
int x,y;
};
bool operator<(H x,H y)
{
return x.x<y.x;//从大到小
}
priority_queue<int,vector<int>,greater<int> > pq;
int main()
{
priority_queue<H>Q;
priority_queue<int,vector<int>,greater<int> >pq;//小根堆
for(int i=1;i<=10;i++) pq.push(i);
for(int i=1;i<=5;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Q.push(H{x,y});
}
while(!Q.empty())
{
printf("%d %d\n",Q.top().x,Q.top().y);
Q.pop();
}
while(!pq.empty())
{
printf("%d\n",pq.top());
pq.pop();
}
}