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