(一):queue 队列
queue的头文件是<queue>.
定义queue对象的示例代码如:
queue<int>q; 队列内存放的是int类型的数
queue<double> 队列内存放的是double类型的数
queue<node>q; 队列内存放的是结构体类型
入队列:q.push(x) 将x元素放到队列的末端。
出队列:q.pop() 将第一个元素删除
访问队首元素: q.front();
访问队中的元素的个数: q.size();
(二):priority_queue 优先队列
priority_queue模板类有三个模板参数,第一个是元素类型,第二个容器类型,第三个是比较算子,其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队,即在默认比较算子下,数值大的先出队)。
定义priority_queue对象的示例代码如下:
priority_queue<int> p;
priority_queue<int, vector<int>, greater<int> > p //从小到大排列
priority_queue<int,vector<int>,less<int> >p;// 从大到小排列
自定义数据类型
定义自己的比较算子,方法有多种,重载比较运算符。
struct node
{
int a,b;
bool operator <(const node &x)const
{
return a<x.a;
}
};
priority_queue<node>q;
注意:
这里是按照a的顺序从大到小出队的。
或者:
struct cmp
{
bool operator()(const int &a,const int& b)
{
return a > b;//队列的顶部放最小的元素,切记!!!!
}
};
priority_queue<int,vector<int>,cmp> cd;//以小优先,需要重载运算符
访问优先队列的队首元素 q.top() ;
出队列: q.pop();
入队列: q.push(x);
判断优先队列是否为空: q.empty();
(三):stack 栈
stack的头文件 <stack>.
定义stack对象的示例代码如下:
stack<int> s1;
stack<string> s2;
Stack 操作:
入栈 :q.push(x);
出栈 :q.pop(); 注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶 :q.top();
判断栈空 :q.empty(); 当栈空的时, 返回true。
访问栈中的元素个数 :q.size();
(四):vector
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
Vector 还可以这样定义:vector<int>g[1000];
(五):map
map是键-值对的集合。map类型通常可理解为关联数组。
map的头文件 :#include<map>;
map对象的定义:
map<string,int>q; map<int,int>q; map<string,node>q; map<int,node>; map<int,string>q;
map添加元素:
如:map<int,string>q; q[100]=”adnsnd”;
还可以:q.insert(pair<int,string>(100,”adnsnd”));
q.insert(map<int,string>::value_type(100,”adnsnd”)) ;
map查找并读取元素:
如map<int,string>q;
最简单的方法:int n=q[“dadad”];
q.count(x); 返回q中x出现的次数。
判断q中x是否出现过可以这样:
if(q.find(x)==q.end()) //x在没有在q中出现过。
使用迭代器判断:
map<int,string>::iterator it=q.find(x);
if(it!=q.end()) //x在q中出现过。
map中删除元素:
q.erase(x)//删除q中键为x的元素。返回size_type类型的值,表示删除的元素的个数。
map对象的迭代遍历:
map<int,string>::const_iterator it=q.begin();
While(it!=q.end())
{
printf(“%d %d\n”,it-first,it-second);
it++;
}
(六)set
头文件:#include<set>
set对象的定义:set<int>ivec;
set中添加元素:
ivec.insert(10);
set中获取元素
ivec.find(x);
判断x是否在ivec中出现过可以用:
ivec.find(x); 也可以用 ivec.count(x);这里count的返回值只能是1或0。
set的遍历;
set<int>::iterator it=ivec.begin();
While(it!=q.end())
{
printf(“%d ”,*it);
it++;}
set的删除元素:
it=ivec.find(x);
ivec.erase(it);
set 的lower_bound/upper_bound的用法:
使用迭代器 set<int>::iterator itlow,itup;
itlow=ivec.lower_bound(x);
itup=ivec.upper_bound(x);
lower_bound返回的是在ivec中大于或等于x的第一个数的位置,upper_bound返回的是在ivec中大于x的第一个数的位置;