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; }