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;}
}wx;
struct zlkk{//大根堆 
    int x;
    bool operator <(zlkk y) const{return x<y.x;}
}wxx;
priority_queue<zlk> Q;
priority_queue<zlkk> P;
int main(){
    while(~scanf("%d",&wx.x))Q.push(wx),wxx.x=wx.x,P.push(wxx);
    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

/*
set和multiset的区别只有set不能判重,而multiset可以判重,其余支持的操作都一模一样
1.size() 表示set里元素的个数
2.empty() 表示set里面是否有数据,有则返回0无则返回1
3.clear() 清空
4.迭代器:形如set<int>::iterator it;
5.begin(),返回第一个元素的迭代器
6.end(),返回最后一个元素d的下一个元素的迭代器
7.insert() 插入一个元素
8.find(x) 返回set中一个数值等于x的迭代器,若不存在则返回end();
9.lower_bound(x) 返回set中第一个大于等于x的迭代器 
10.upper_bound(x) 返回set中第一个大于x的迭代器 
11.erase()
  I.当erase(it),it为一个迭代器时,删除set中迭代器it指向的元素
  II.当erase(x),x为一个数值时,删除set中所有值为x的元素
12.count(x) 返回set中值等于x的元素的个数 
*/
#include<iostream>
#include<cstdio>
#include<set>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
set<int> Q;
multiset<int> P,K;
int a;
int main(){
    while(~scanf("%d",&a)) Q.insert(a),P.insert(a),K.insert(a);
    printf("%d %d
",Q.size(),P.size());
    for(set<int>::iterator it=Q.begin();it!=Q.end();it++) printf("%d ",*it); puts("");
    for(multiset<int>::iterator it=P.begin();it!=P.end();it++) printf("%d ",*it);
    for(set<int>::iterator it=Q.begin();it!=Q.end();it++) printf("
#Num=%d,%d,%d",*it,Q.count(*it),P.count(*it)); puts("");
    rep(i,1,10) printf("%d %d %d %d %d %d
",*Q.find(i),*Q.lower_bound(i),*Q.upper_bound(i),*P.find(i),*P.lower_bound(i),*P.upper_bound(i));
    set<int>::iterator it=Q.end(); it--; 
    while(!Q.empty()){
        printf("%d ",*it);
        Q.erase(it);
        if(!Q.empty()){it=Q.end();it--;}    
    }puts("");
    multiset<int>::iterator its=P.end(); its--; 
    while(!P.empty()){
        printf("%d ",*its);
        P.erase(its);
        if(!P.empty()){its=P.end();its--;}    
    }puts("");
    its=K.end(); its--; 
    while(!K.empty()){
        printf("%d ",*its);
        K.erase(*its);
        if(!K.empty()){its=K.end();its--;}    
    }
    return 0;
}

 

/*实现逆序的方法其实和优先队列是通法
都是让函数里面认为放在后面的元素的放到前面,反之亦然,以实现逆序
*/ 
#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;}
}wx;
set<zlk> Q;
multiset<zlk> P;
int main(){
	while(~scanf("%d",&wx.a)) Q.insert(wx),P.insert(wx);
	printf("%d %d
",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;
}

原文地址:https://www.cnblogs.com/handsome-zlk/p/10169813.html