stl基础

STL基础

难度偏低,适合入门

map

//定义
map<int,int>mp;
//将一个整数映射到另一个整数
mp[1]=2;
mp[1000000]=1;
mp[987654321]=3;
//迭代器遍历容器内所有元素(iterator)
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
	printf("%d->%d",it->first,it->second);//映射
}
//mp.begin()容器的开始位置
//mp.end()容器的最后一个位置+1
if (mp.find(1)==mp.end()){//时间复杂度O(log n)
	printf("not found\n");
}else{
	printf("find\n");
}
//可以将一个字符串进行映射(字符串哈希)
mp["abc"]=1;
mp["aaa"]=2;
mp["bbb"]=2;
mp["ccc"]=2;
mp["abc"]=9;//记录最后一次
printf("%d",mp.size());//输出为4
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++){
	printf("%s  %d",it->first.c_str(),it->second);
}//c_str将其转换为一个字符串输出

例题:统计数字

描述 给定n个数字,统计出现次数最多的。如果有多个数字出现次数都是最多的,从小到大输出。
输入 第一行一个整数n,表示数字个数。 接下来一行n个数。
输出 从小到大输出,次数最多的数字。

参考代码:

int main(){
	int n,cnt=0;
	scanf("%d",&n);
	map<int,int>mp;
	for(int i=0;i<n;i++){
		int t;
		scanf("%d",&t);
		mp[t]++;
		cnt=max(cnt,mp[t]);
	}
	for(map<int,int>::iterator i=mp.begin();i!=mp.end();i++){
		if(i->second==cnt){
			printf("%d ",i->first);
		}
	}
	return 0;
}

vector

//向量
vector<int>a;
//往向量里面放一个元素
for(int i=1;i<=10;i++){
	a.push_back(i);
} 
//打印向量中的所有元素
for(int i=0;i<(int)a.size();i++){//a.size()是无符号的整数类型(unsigned int) 
	printf("%d ",a[i]);
} //所以读取vector长度时需要加类型转换int
//定义一个vector数组
vector<int> vec[1000000];
//向数组内插入元素
vec[i].push_back(x); 

例题:战士

描述 有n个阵营,一些战士过来投奔。你需要处理接下来mm个事件: 1 x y:表示有一个战斗力为y的战士要加入编号为xx的阵营。 2 a b: 询问到目前为止,编号为a的阵营中,第b个过来的战士的战斗力。
输入 第一行两个整数n和m. 接下来mm行,每行一个时间。
输出 对于每个询问,输出相应的结果。

参考代码:

#include <bits/stdc++.h>
using namespace std;
vector<int>vec[100010];
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++){
		int t,x,y;
		scanf("%d %d %d",&t,&x,&y);
		if(t==1){
			vec[x].push_back(y);
		}else{
			printf("%d\n",vec[x][y-1]);
		}
		
	}
	return 0;
}

优先队列(略讲)

//优先队列,堆
//能将元素按照从大到小的顺序排列
priority_queue<int> q;
q.push(x);//往内插入元素
while(q.size()>0){
	printf("%d\n",q.top());//输出堆顶元素
	q.pop();
}
//q.push(-x)往里面放入其负值,输出为从小到大,取出再加"-",q.pop();
while(n--)q.push(-x);
while(q.size()>=2){
	int a=-q.top();//取出最小的
	q.pop();//丢掉最小数
	int b=-q.top();
	q.pop();
}

高级用法:

struct node{
	int x;//自定义比较规则 
	//int y,z;
	bool operator < (const node& cmp) const{
		return x<cmp.x;//cmp是另一个node
		//当前node的x与另一个node的x作比较
	}
	bool operator == (const& a,const& b){
		return a.x==b.x;
	}
};
int main(){
	priority_queue <node> q;//node需要有一个自定义的比较规则
	node a,b;
	a.x=1;b.x=2;
	q.push(a);
	q.push(b);
	while(q.size()>0){//输出堆里所有元素 
		printf("%d ",q.top().x) ;
		q.pop(); 
	}
	if(a==b){//相等返回1,否则返回0
	……;//结构体相等
	}
	return 0;
}

set

#include <set>
int main(){
	//默认从小到大 
	set<int>st;
	st.insert(1);//set不允许存储重复元素 
	st.insert(1);
	st.insert(2);
	cout<<st.size()<<endl;// 答案为2
	 for(set<int>::iterator it=st.begin();it!=st.end();it++){
	 	printf("%d",*it);
	 } 
	 //输出最小值
	 cout<<*st.begin()<<endl;
	 if(st.size()>0){
	//输出最大值 
	 	cout<<*(--st.end())<<endl;//迭代器的指针,输出地址所指向的值 
	 }
	 //删除
	 st.erase(1);
	 st.erase(2);
	 cout<<st.size()<<endl; 
	 //查找一个数的位置 
	 set<int>::iterator it=st.find(1);//找到他的地址(*it是它对应的元素) 
	 if(it!=st.end()){//set里面存在1 
	 	st.erase(it);//查找到位置并且删除他的地址 (删地址并且删除数值)
	 }
	st.insert(1);
	st.insert(3);
	st.insert(5);
	//查找第一个大于等于x的数字 
	set<int>::interator it=st.lower_bound(2);//大于等于2的第一个位置 
	if(it!=st.end()){
		printf("%d",*it);
	}
	//查找第一个大于x的数字 
	set<int>::interator it=st.upper_bound(3);//大于等于2的第一个位置 
	if(it!=st.end()){
		printf("%d",*it);
	}
	//找到第一个小于x的数 
	//(假如要往前跳一个,先判断是不是begin()) 
	//(假如要往后挑一个,先判断是不是end()) 
	set<int>::iterator it=st.lower_bound(2);
	if(it!=st.begin()){
		--it;
		printf("%d\n",*it);
	}
	return 0;
}
操作例题:multiset常规操作
set和multiset的区别:set插入的元素不能相同,但是multiset可以相同。
描述 设计一个数据结构,支持如下操作 插入一个数x 删除一个数x,如果不存在,就忽略这条指令。如果有多个,只删除一个。 输出大于x的最小的数,如果没有输出"max" 输出小与x的最大的数,如果没有输出"min" 输出最大值并删除,如果没有元素,忽略这条指令 输出最小值并删除,如果没有元素,忽略这条指令 所有指令结束后,从小到大输出数据结构中所有的数。
输入 第一行一个整数n,表示操作数 接下来n行,每行如下6个之一: 1 x:插入一个数x 2 x:删除x,如果x不存在,忽略这条指令 3 x:输出大于x的最小值,如果没有,输出max 4 x:输出小于x的最大值,如果没有,输出min 5 :输出最大值,并删除,如果没有,忽略这条指令 6:输出最小值,并删除,如果没有,忽略这条指令
输出 根据每条指令,输出相应的结果。

参考代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,b;
	scanf("%d",&n);
	multiset<int>st;
	while(n--){
		scanf("%d",&a);
		switch(a){
			case 1:{
				scanf("%d",&b);
				st.insert(b);
				break;
			}
			case 2:{
				scanf("%d",&b);
				multiset<int>::iterator it = st.find(b);
				if(it != st.end())
					st.erase(it);
				break;
			} 
			case 3:{
				scanf("%d",&b);
				multiset<int>::iterator it2 =st.upper_bound(b);
				if(it2!=st.end()) printf("%d\n",*it2);
				else printf("max\n");
				break;
			}
			case 4:{
				scanf("%d",&b);
				multiset<int>::iterator it3 =st.lower_bound(b);
				if(it3!=st.begin())printf("%d\n",*(--it3));
				else printf("min\n");
				break;
			}
			case 5:{
				if(st.size()>0){
					printf("%d\n",*(--st.end()));
					st.erase(--st.end());
				}
				break;
			}
			default:{
				if(st.size()>0){
					printf("%d\n",*st.begin());
					st.erase(st.begin());
				}
				break;
			}
		}
		
	}
	for(multiset<int>::iterator it=st.begin();it!=st.end();it++){
		printf("%d ",*it);
	}
	return 0;
} 
发布了3 篇原创文章 · 获赞 1 · 访问量 56
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览