STL 学习(持续更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fufck/article/details/86695706

前言:一点都不会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();	
	}	
} 

猜你喜欢

转载自blog.csdn.net/fufck/article/details/86695706