一、QQueue

​ QQueue是Qt的一个通用容器类。该类为相同类型的项实现了队列数据结构。队列是先入先出(FIFO)结构。使用enqueue()将项目添加到队列的尾部,并使用dequeue()从头部检索项目。head()函数访问head项,而不需要删除它。

​ 例如:

#include <QCoreApplication>
#include <QQueue>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QQueue<int> queue;
    //入队操作
    queue.enqueue(1);
    queue.enqueue(2);
    queue.enqueue(3);
	//当全部元素入队后,队列大小为3
    qDebug()<<queue.size();
    
    //执行出队操作
    while (!queue.isEmpty())
        qDebug() << queue.dequeue() << Qt::endl;
	//当全部元素都出队后,队列大小为0
    qDebug()<<queue.size();

    return a.exec();
}

​ 该示例输出结果为:

3
1 

2 

3 

0

​ QQueue继承于QList。QList的所有功能也适用于QQueue。所以可以使用isEmpty()来检测队列是否为空,并且可以使用QList的iterator类(例如QListIterator)来遍历QQueue。但除此之外,QQueue还提供了三个方便的函数:enqueue()、dequeue()和head()。使先入先出(FIFO)的实现更加容易。

​ QQueue的值类型必须是可分配的数据类型。这涵盖了大多常用数据类型,但是编译器不允许将QWidget存储为QQueue的一个值,但是可以使用QWidget *。


二、QStack

​ QStack是Qt的一个泛型容器类。该类为相同类型的项实现堆栈数据结构。

​ 堆栈是后进先出(LIFO)结构。使用push()将项目添加到堆栈顶部,并使用pop()从顶部检索项目。top()函数提供对最上面的项的访问。

​ 例如以下代码:

#include <QCoreApplication>
#include <QStack>
#include <QDebug>
#incluee <QString>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QStack<QString> stack;
    stack.push("iriczhao");
    stack.push("hello");
    stack.push("world");
    
    //入栈后,stack大小为3
    qDebug()<<stack.size();
	
    //执行出栈操作
    while (!stack.isEmpty())
        qDebug() << stack.pop() << stack.size()<<Qt::endl;

    //出栈后,stack大小为0
    qDebug()<<stack.size();
    
    return a.exec();
}

​ 输出结果为:

3
"world" 2 

"hello" 1 

"iriczhao" 0 

0

​ QStack继承QVector。QVector的所有功能也适用于QStack。例如,可以使用isEmpty()来检测堆栈是否为空,并且可以使用QVector的迭代器类(例如QVectorIterator)遍历QStack。除此之外,QStack还提供了三个方便的函数:push()、pop()和top(),这使得LIFO的实现更加容易。

​ 与QQueue一样,QStack的值类型必须是可分配的数据类型。编译器不允许将QWidget存储为一个值;在实际使用中,可以用QStack存储一个QWidget *。

三、尾

​ 在实际开发中,队列和栈这两种数据结构也经常使用到,Qt的QQueue基于QList实现;QStack基于QVector实现,只是QQueue和QStack把队列/栈的概念更加具体化。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐