c++

C++之Queue用法总结

打破规则,强制保存

Posted by VK on November 8, 2019

C++ Queue用法总结

**queue 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