C++ STL小总结

一、vector

/*
1.size(),表示长度,vector里面的储存范围为 0~x.size()-1;
2.empty(),表示vector里面是否有数据,有则返回0无则返回1
3.clear()
4.迭代器:vector<int>:iterator it;
5.begin(),返回第一个元素的迭代器
6.front(),返回第一个元素的值
7.back(),返回最后一个元素的值 
8.end(),返回最后一个元素迭代器的下一个迭代器,即*x.end()=x[x.size()];
9.pop_back() && push_back();
*/ 
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> x;
int a;
int main(){
	while(~scanf("%d",&a)) x.push_back(a);
	for(vector<int>::iterator it=x.begin();it!=x.end();it++) cout<<*it<<" ";
	cout<<endl;
	while(!x.empty()) printf("%d ",x.back()),x.pop_back();
}

 

 

二、priority_queue

/*
总结一下:
1.Q.top()  返回首项的值
2.Q.pop()  弹出堆首
3.Q.empty()表示priority_queue里面是否有数据,有则返回0无则返回1
请注意,不重载运算符时,默认是大根堆
*/ #include<iostream> #include<cstdio> #include<queue> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; struct zlk{//小根堆 int x; bool operator <(zlk y) const{return x>y.x;} }w; struct zlkk{//大根堆 int x; bool operator <(zlkk y) const{return x<y.x;} }wx; priority_queue<zlk> Q; priority_queue<zlkk> P; int main(){ while(~scanf("%d",&w.x))Q.push(w),wx.x=w.x,P.push(wx); while(!Q.empty()) printf("%d ",Q.top().x),Q.pop();cout<<endl; while(!P.empty()) printf("%d ",P.top().x),P.pop(); return 0; }

三、set&&multiset

 

 1 /*
 2 set和multiset的区别只有set不能判重,而multiset可以判重,其余支持的操作都一模一样
 3 1.size() 表示set里元素的个数
 4 2.empty() 表示set里面是否有数据,有则返回0无则返回1
 5 3.clear() 清空
 6 4.迭代器:形如set<int>::iterator it;
 7 5.begin(),返回第一个元素的迭代器
 8 6.end(),返回最后一个元素d的下一个元素的迭代器
 9 7.insert() 插入一个元素
10 8.find(x) 返回set中一个数值等于x的迭代器,若不存在则返回end();
11 9.lower_bound(x) 返回set中第一个大于等于x的迭代器 
12 10.upper_bound(x) 返回set中第一个大于x的迭代器 
13 11.erase()
14   I.当erase(it),it为一个迭代器时,删除set中迭代器it指向的元素
15   II.当erase(x),x为一个数值时,删除set中所有值为x的元素
16 12.count(x) 返回set中值等于x的元素的个数 请注意,如果不重载运算符,默认是从小往大排序
17 */
18 #include<iostream>
19 #include<cstdio>
20 #include<set>
21 #define rep(i,a,b) for(int i=a;i<=b;i++)
22 using namespace std;
23 set<int> Q;
24 multiset<int> P,K;
25 int a;
26 int main(){
27     while(~scanf("%d",&a)) Q.insert(a),P.insert(a),K.insert(a);
28     printf("%d %d\n",Q.size(),P.size());
29     for(set<int>::iterator it=Q.begin();it!=Q.end();it++) printf("%d ",*it); puts("");
30     for(multiset<int>::iterator it=P.begin();it!=P.end();it++) printf("%d ",*it);
31     for(set<int>::iterator it=P.begin();it!=P.end();it++) printf("\n#Num=%d,%d,%d",*it,Q.count(*it),P.count(*it)); puts("");
32     rep(i,1,10) printf("%d %d %d %d %d %d\n",*Q.find(i),*Q.lower_bound(i),*Q.upper_bound(i),*P.find(i),*P.lower_bound(i),*P.upper_bound(i));
33     set<int>::iterator it=Q.end(); it--; 
34     while(!Q.empty()){
35         printf("%d ",*it);
36         Q.erase(it);
37         if(!Q.empty()){it=Q.end();it--;}    
38     }puts("");
39     multiset<int>::iterator its=P.end(); its--; 
40     while(!P.empty()){
41         printf("%d ",*its);
42         P.erase(its);
43         if(!P.empty()){its=P.end();its--;}    
44     }puts("");
45     its=K.end(); its--; 
46     while(!K.empty()){
47         printf("%d ",*its);
48         K.erase(*its);
49         if(!K.empty()){its=K.end();its--;}    
50     }
51     return 0;
52 }

 

 

 

/*实现逆序的方法其实和优先队列是通法
都是让函数里面认为放在后面的元素的放到前面,反之亦然,以实现逆序
*/ 
#include<iostream>
#include<cstdio>
#include<set>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
struct zlk{
	int a;
	bool operator <(zlk x) const{return a>x.a;}
}w;
set<zlk> Q;
multiset<zlk> P;
int main(){
	while(~scanf("%d",&w.a)) Q.insert(w),P.insert(w);
	printf("%d %d\n",Q.size(),P.size());
	for(set<zlk>::iterator it=Q.begin();it!=Q.end();it++) printf("%d ",*it); puts("");
	for(multiset<zlk>::iterator it=P.begin();it!=P.end();it++) printf("%d ",*it);
	return 0;
}

posted @ 2018-12-24 17:22  niolle  阅读(384)  评论(0编辑  收藏  举报