助力PAT甲级/乙级取得满分的小技巧,STL容器

STL容器的高级玩法

写在前面:本人于2020PAT甲级取得满分(见本人其他博客),在刷题过程中我有了很多自己的小经验和技巧,在这里分享给大家,祝大家刷题顺利,早日拿到免费的PAT徽章~~

注意:这里是分享小技巧,并不是全面介绍容器,此处默认你已经掌握了容器的基本用法!

1. Vector

大名鼎鼎的Vector,动态数组嘛,用起来很方便,但是你可知道vector不仅仅是动态数组,它还可以是队列/优先队列,栈?

Vector变成队列和栈的关键函数

  • erase
    你会不会感到很疑惑?删除函数有什么了不起的?竟然还能玩出花样?
    君莫急,且看:
vector<int>V;
V.push_back(1);
V.push_back(2);
V.push_back(3);
V.push_back(4);

对于栈很简单,使用:

V.erase(--V.end());
V.erase(V.rbegin());//与上面等价!
V.pop_back();

这就完成了删除最后一个元素操作!
立即推,vector等于stack,所以完全没必要去熟悉stack容器!

  • erase变队列
V.erase(V.begin());

这样就实现了删除第一个元素,这就是vector版的队列!!
至于优先队列(自定义排序顺序),可以在所有元素进入vector以后使用sort函数自定义cmp,然后实现优先队列(效率相同!!)

sort(V.begin(),V.end(),cmp);
//cmp为自定义比较关系
+
  • Vector变双端队列
V.insert(V.begin,1);

这样就在最前面插入了元素1,通过以上操作

vector在保持动态数组的同时 还是队列,双端队列,栈,优先队列!

2.map的高级玩法**

  • 用来对数字进行排序,效率无敌快!
    比如:
int val;
map<int,int>Ma;
for(int i=0;i<N;i++
{
	scanf("%d",&val);
	Ma[val]++;
}
//这样得到的map就是有序系列,可以直接输出!!
for(auto it=Ma.begin();it!=Ma.end();it+){
	for(int j=0;j<it->second;j++){
		printf(" %d",it->first);
	}
}

强不强!!这样排序的效率远超过了set/underorder_set!!!
利用second值也可以避免重复!!!
一举两得,非常棒!!!

  • Map用来哈希映射字符串
map<string,int>Ma;
map<int,string>Mb;
string s;
int index =1;
for(int i=0;i<N;i++){
	cin>>s;
	if(Ma[s]!=0)continue;//0不存数据,下标从1开始,已经映射过的就跳过,不再映射。
	Ma[s]=index;
	Mb[index]=s;
	index++;
}

这样就把string变成了int,访问直存直取,效率无敌!!!

还有字符串的玩法,那个内容多一些,后面再来补上。

大笨钟,当~

你可能感兴趣的:(甲级代码精炼)