C++ Queue用法总结
**queue
//以下为C的实现,作为对比
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
ElementType *Data;//存储元素的数组
Position Front, Rear;//队列的头、尾指针
int MaxSize;//队列的最大容量
};//Front作出队删除操作,Rear作入队操作
typedef PtrToQNode Queue;
Queue CreateQueue(int MaxSize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementTye *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
}
Queue.empty()—>判断队列是否为空,空返回1,非空返回0
bool Isempty(Queue Q)
{
return (Q->Front == Q->Rear);
}
Queue.push()—>入队,即在已有元素后面增加元素
void AddQ(Queue Q,ElementType X)
{
Q->Rear = (Q->Rear + 1) % Q->MaxSize;
Q->Data[Q->Rear] = X;
}
Queue.size()—>输出现有队列的长度
循环队列可以通过记录cnt来输出现有队列的长度,即每入队一次cnt++;
Queue.front()—>显示队列第一个元素,但不出队列,即为Q->Data[Front]; Queue.back()—>显示最后一个元素。在循环队列中,即为Q->Data[Rear]; Queue.pop()—>出队列,不显示出队列的元素
void DeleteQ(Queue Q)
{
Q->Front = (Q->Front + 1) % Q->MaxSize;
}
C++ Queue容器使用实例:
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
struct task {
int id;
std::function<void()> f;
void operator()() { f(); }
};
queue<struct task> q;
void fun(void) {
cout << "Having fun!" << endl;
}
int main() {
cout << "Creating a task object" << endl;
task t;
t.id = 1;
t.f = &fun;
cout << "Calling function directly from object" << endl;
t.f();
cout << "adding the task into the queue" << endl;
q.push(t);
cout << "calling the function from the queue" << endl;
task tsk = q.front();
tsk.f();
q.pop();
q.push({ 1, [] {std::cout << "Even more fun\n"; } });
auto t2 = q.front();
t2.f(); // invoke conventionally
t2(); // invoke via operator()
q.pop();
}
限制queue的大小
比如有需求如下,指定队列只能有3个元素,当第4个元素需要push的时候,将第1个远处弹出,第4个元素入队,此时要求队列的元素为2,3,4,这3个元素
解决:
You can use a boost::circular_buffer
wrapped by a std::queue
, something like this:
#include <queue>
#include <boost/circular_buffer.hpp>
typedef std::queue<my_type, boost::circular_buffer<my_type>> my_queue;
const int n = 3;
...
my_queue q(boost::circular_buffer<my_type>(n));
q.push(1);
q.push(2);
q.push(3);
q.push(4); // queue now contains 2,3,4
疑问:为什么不能直接用circular_queue
?