1. 循环队列通过 front 和 rear 来标记队首和队尾。如果循环队列用数组实现,并记数组长度为len,那么:
2. 判断队列是否为空:front == rear
3. 判断循环队列是否为满
#include //头文件
queue q;
q.push(); // 插入元素到队尾 (并排序)
q.pop(); // 弹出队头元素
q.front(); //普通队列访问队头元素
q.empty(); // 队列是否为空,为空返回1,不为空返回0
q.size(); // 返回队列内元素个数
q.emplace(); // 原地构造一个元素并插入队列(C++11新特性)
q.swap(); // 交换内容
priority_queue pq;
pq.top(); //优先级队列访问队头元素,因为优先级队列的底层实现是堆
(
优先队列和普通队列的区别)
q.top()
而不是q.front()。
priority_queue
可以自定义其中数据的优先级,让优先级高的排在队列前面,优先出队。priority_queue
第一种,直接使用默认的,默认是最大堆:
它的模板声明带有三个参数,priority_queue
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector、deque ,但不能用 list。
STL里面默认用的是 vector,比较方式默认用 operator< ,所以如果你把后面俩个
参数缺省的话,优先队列就是大顶堆,队头元素最大。
#include
#include
//降序队列:最大堆
priority_queue ,less > q; //这里c++11之前需要空格,不然成了右移运算符,现在可以不留空格了
//上面等价于:
priority_queue q;//默认为最大堆
//-----------------------
int a[len] = {3,5,9,6,2};
priority_queue qi;
for(i = 0; i < len; i++)
qi.push(a[i]);
for(i = 0; i < len; i++)
{
cout<
第二种,显示声明为最小堆:
如果要用到小顶堆,则一般要把模板的三个参数都带进去。要把元素从小到大输出,可传入一个比较函数,使用functional.h函数对象作为比较函数。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
priority_queue
对于自定义类型,必须自己重载 operator< 或者自己写仿函数!!!
//------------------
#include
#include
#include
//升序队列:最小堆
priority_queue ,greater > q; //这里一定要有空格,不然成了右移运算符
using namespace std;
struct Node{
int x, y;
Node( int a= 0, int b= 0 ):
x(a), y(b) {}
};
bool operator<( Node a, Node b ){
if( a.x== b.x )
return a.y> b.y;
return a.x> b.x;
}
int main(){
priority_queue q;
for( int i= 0; i< 10; ++i )
q.push( Node( rand(), rand() ) );
while( !q.empty() ){
cout << q.top().x << ' ' << q.top().y << endl;
q.pop();
}
getchar();
return 0;
}
或者这样定义也是能达到效果的:
struct Node{
int x, y;
Node( int a= 0, int b= 0 ):
x(a), y(b) {}
friend operator<( Node a, Node b ){
if( a.x== b.x )
return a.y> b.y;
return a.x> b.x;
}
};
//-------------------
自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue, greater >;
原因是 greater 没有定义,如果想用这种方法定义
则可以按如下方式
例子:
#include
#include
using namespace std;
struct Node{
int x, y;
Node( int a= 0, int b= 0 ):
x(a), y(b) {}
};
struct cmp{
bool operator() ( Node a, Node b ){
if( a.x== b.x ) return a.y> b.y;
return a.x> b.x; }
};
int main(){
priority_queue, cmp> q;
for( int i= 0; i< 10; ++i )
q.push( Node( rand(), rand() ) );
while( !q.empty() ){
cout << q.top().x << ' ' << q.top().y << endl;
q.pop();
}
getchar();
return 0;
}
priority_queue 也实现了赋值运算,可以将右操作数的元素赋给左操作数;同时也定义了拷贝和移动版的赋值运算符。需要注意的是,priority_queue 容器并没有定义比较运算符。因为需要保持元素的顺序,所以添加元素通常会很慢。
#include //头文件
priority_queue pq;//默认最大堆
pq.push(); // 插入元素到队尾 (并排序)
pq.pop(); // 弹出队头元素,即移除第一个元素
pq.top(); //优先级队列访问队头元素,返回优先级队列中第一个元素的引用,因为优先级队列的底层实现是堆
pq.empty(); // 队列是否为空,为空返回1,不为空返回0
pq.size(); // 返回队列内元素个数
pq.emplace(); // 原地构造一个元素并插入队列(C++11新特性)
pq.swap(); // 交换内容
//对 priority_queue;//进行操作的一些限制:
push(const T& obj);//将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
push(T&& obj);//将obj放到容器的适当位置,这通常会包含一个排序操作。
emplace(T constructor a rgs...);//通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
swap(priority_queue& other);//和参数的元素进行交换,所包含对象的类型必须相同。
//---------------------
queue q;
q.front(); //普通队列访问队头元素
//降序队列:最大堆
priority_queue ,less > q; //这里一定要有空格,不然成了右移运算符
//等价于:
priority_queue q;
//升序队列:最小堆
priority_queue ,greater > q; //这里一定要有空格,不然成了右移运算符
#include
#include
#include
using namespace std;
int main()
{
priority_queue > pq;
//下面三种添加方式是一样的:
//1.第一种添加pair元素方式
pair i1(1, 2);
pq.push(i1);
//2.第一种添加pair元素方式
pq.push(pair(1, 3));
//3.第一种添加pair元素方式
pq.push(make_pair(2,5);
while (!a.empty()) //该优先级队列不为空
{
//这里访问元素用:pq.top().first, 和map中有区别,用.不用->
cout< m;
m.insert(pair(8,9));
cout<first<<' '<second<<'\n';//用->
}
输出:
2 5
1 3
1 2
8 9
#include
#include
using namespace std;
//方法1
struct tmp1 //重载运算符<
{
int x;
tmp1(int v) {x = v;}
bool operator<(const tmp1& t) const
{
return x < t.x; //大顶堆
}
};
//方法2
struct tmp2 //重写仿函数
{
bool operator() (tmp1 a, tmp1 b)
{
return a.x < b.x; //大顶堆
}
};
int main()
{
tmp1 a(1);
tmp1 b(2);
tmp1 c(3);
priority_queue d;
d.push(b);
d.push(c);
d.push(a);
while (!d.empty()) //队列非空
{
cout<, tmp2> f;
f.push(c);
f.push(b);
f.push(a);
while (!f.empty())
{
cout<
deque的各项操作只有下面2点和vector不同,其他均与vector相同:
注意:
#include
deque dq;
deque dq1;
deque dq2(dq1);
deque dq(n);//n个元素空间
deque dq(n,2);//n个2的双端队列
deque dq(beg,end);//dq的(beg,end)范围内的元素
dq.~deque;//销毁dq中所有元素并释放内存空间
deque dq;
dq.size();
dq.empty();
dq.max_size;
dq.at[idx];//返回下标是idx的元素
dq.front();
dq.back();
dq.begin();
dq.end();
dq.rbegin();
dq.rend();
deque dq1;
deque dq2;
dq1==dq2
dq1!=dq2
dq1dq2
dq1<=dq2
dq1>=dq2
deque dq1;
deque dq2;
dq1=dq2;
dq1.assign(n,elem);
dq1.assign(beg,end);
dq1.swap(dq2);
swap(dq1,dq2);
deque dq;
dq.insert(pos,elem);
dq.insert(pos,n,elem);
dq.insert(pos,beg,end);
dq.push_back(elem);
dq.pop_back();
dq.push_front(elem);
dq.pop_front();
dq.erase(pos);
dq.erase(beg,end);
dq.resize(num);//如果num>dq.size(),新的元素空间用默认值初始化
dq.resize(num,elem);//如果num>dq.size(),新的元素空间用elem初始化
dq.clear();//移除所有元素,使容器为空,不释放空间
参考:https://blog.csdn.net/weixin_36888577/article/details/79937886
参考:https://www.jianshu.com/p/978311125b34
参考:https://blog.csdn.net/xiajun07061225/article/details/7442816
参考:http://c.biancheng.net/view/480.html