queue
遵循先进先出原则
#include<queue>
queue<int> q;
q.push(x);入队,将x 接到队列的末端。
q.pop();出队, 弹出队列的第一个元素,没有返回值
q.front()返回队首元素
q.back()返回队尾元素
q.empty()判断队列空,当队列空时,返回true。
q.size()访问队列中的元素个数
stack
遵循先进后出原则
#include<stack>
stack<int> s;
s.empty() 堆栈为空则返回真
s.pop() 移除栈顶元素
s.push() 在栈顶增加元素
s.size() 返回栈中元素数目
s.top() 返回栈顶元素
vector
#include<vector>
定义
vector<int>a(10);定义具有10个整型元素的向量
vector<int>a(10,1);定义具有10个整型元素的向量,初值为1
vector<int>a(b); 拷贝b
vector<int>a(b.begin(),b.begin+3); 拷贝b到b+3
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);数组拷贝
添加
v.push_back(i);在最后添加i
v.insert(v.begin()+1,5);在v[1]后插入5
v.insert(v.begin(),n,m);在v[0]后插入n个m
v.insert(v.begin(),str,str+len);在v[0]后加入一个长为len的str[]
v.assign(v1.begin(),v1.end())相当于拷贝函数,把first到last的值赋值给调用者
v.assign(10,1) 把10个1赋值给v
删除
v.pop_back(); 删除a向量的最后一个元素
v.erase(v.begin()+1,v.begin()+3);删除从a[1]到a[2]
其他
v.back();返回a的最后一个元素
v.front();返回a的第一个元素
v[i]; 返回a的第i元素
v.clear(); 清空a中的元素
v.empty(); 判断a是否为空,空则返回true,非空则返回false
v.swap(b);b为向量,将a中的元素和b中的元素整体交换
v.size();返回a中元素的个数
算法
#include<algorithm>
sort(v.begin(),v.end());小到大排列
reverse(v.begin(),v.end()); 元素倒置
copy(v.begin(),v.end(),b.begin()+1);
//复制,v.begin()到v.end()复制到,b.begin()+1到*
find(v.begin(),v.end(),10);返回其在向量中的位置
set
begin()–返回指向第一个元素的迭代器
clear()–清除所有元素
count()–返回某个值元素的个数
empty()–如果集合为空,返回true
end()–返回指向最后一个元素的下一个位置;
equal_range()–返回集合中与给定值相等的上下限的两个迭代器
erase()–删除集合中的元素
find()–返回一个指向被查找到元素的迭代器
get_allocator()–返回集合的分配器
insert()–在集合中插入元素
lower_bound()–返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()–返回一个用于元素间值比较的函数
max_size()–返回集合能容纳的元素的最大限值
rbegin()–返回指向集合中最后一个元素的反向迭代器
rend()–返回指向集合中第一个元素的反向迭代器
size()–集合中元素的数目
swap()–交换两个集合变量
upper_bound()–返回大于某个值元素的迭代器
value_comp()–返回一个用于比较元素间的值的函数加粗样式
//A交B=RIntersec
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(RIntersec,RIntersec.begin()));
//A并B=RUnion
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(RUnion,RUnion.begin()));
//A差B=RDiff1
set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(RDiff1,RDiff1.begin()));
map
pair类型
pair<T1, T2> p; 定义了一个空的pair对象p
pair<T1, T2> p(v1, v2); 定义了包含初始值为v1和v2的pair对象p
make_pair(v1, v2) 以v1和v2值创建的一个新的pair对象
#include <stdio.h>
#include <string.h>
#include <string>
#include <utility>
using namespace std;
int main(){
pair<int, string> p1(0, "Hello");
printf("%d, %s\n", p1.first, p1.second.c_str());
pair<int, string> p2 = make_pair(1, "World");
printf("%d, %s\n", p2.first, p2.second.c_str());
return 0;
}
#include<map>
定义
map<k, v> m; 定义了一个名为m的空的map对象
map<k, v> m(m2); 创建了m2的副本m
map<k, v> m(b, e); 创建了map对象m,并且存储迭代器b和e范围内的所有元素的副本
插入
e一个value_type类型的值。
m.insert(make_pair(1, 1));
m[1] = 1
beg和end标记的是迭代器的开始和结束
m.insert(e)
//m.insert(make_pair(1,1))
m.insert(beg, end)
m.insert(iter, e)
m[k]=v
查找和读取
m[k] 返回k对应的值
m.find(k) 返回k对应的值
m.count(k) 返回的是k出现的次数
删除
m.erase(k) 删除的是m中键为k的元素,返回的是删除的元素的个数
m.erase(p) 删除的是迭代器p指向的元素,返回的是void
m.erase(b, e) 删除的是迭代器b和迭代器e范围内的元素,返回void
遍历
map<int, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++){
printf("%d->%d\n", it->first, it->second);
}
排序
看了很多方法,在时间复杂度允许的情况下,用vector<pari<int,int> >复制map<int,int>最方便易懂,学map必学pair,map这里不能直接使用map是因为map不是线性存储。
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<utility>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b){
if(a.second==b.second){
return a.first > b.first;
}
return a.second > b.second;
}
int main(){
int n, k, f;
cin >> n;
map<int,int> m;
for(int i = 0; i < n; i++){
cin >> k;
for(int j = 0; j < k; j++){
cin >> f;
if(m.count(f)!=0){
m[f]++;
}else{
m[f] = 1;
}
}
}
vector<pair<int,int> > v;
vector<pair<int,int> >::iterator itv;
map<int, int>::iterator itm;
for(itm = m.begin(); itm != m.end(); itm++){
pair<int, int> p(itm->first,itm->second);
v.push_back(p);
}
sort(v.begin(),v.end(),cmp);
for(itv = v.begin(); itv != v.end(); itv++){
pair<int,int> p = *itv;
/*这里把p换成*itv编译报错,不知道为什么,
*可能是需要强制类型转换,用v[i]类似数组方式遍历也可
*/
cout << p.first << " " << p.second << endl;
}
return 0;
}