我最近在我的大学开始使用Qt的课程,并且对它的效率印象深刻。浏览文档时,我发现了有关QStack和QQueue的一些信息,这两个类对于我正在开发的项目都很有用。
但是,我一直面临一个难题:如何遍历QStack对象的所有元素?
例如,假设我要遍历以下示例(extracted from Qt's documentation about QStack)中的stack
对象的元素:
QStack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
while (!stack.isEmpty())
cout << stack.pop() << endl;
我设法通过逐个删除堆栈中的每个元素并将它们保存在临时列表中来做到这一点,但这似乎是解决此问题的一种糟糕方法。我还能做什么?
答案 0 :(得分:2)
QStack继承自QVector,因此您可以(但很可能不应该)进行迭代,就像使用QVector一样。
QStack <int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
for (int i : stack)
{
std::cout << i << std::endl;
}
但是,如果需要迭代,很有可能您不要使用堆栈。只需使用实际的QVector。
使用堆栈的目的是对项目“实施” LIFO(后进先出)订购。如果您以任何特定顺序遍历它们,那么您将破坏Stack强制执行的顺序,因此(很可能)一开始就不应使用堆栈。
P.S。这主要集中在QStack上,但是同样的理由也适用于QQueue。区别在于Queue强制执行FIFO(先进先出)排序,并且在QT中QQueue继承自QList,因此将其替换为QList而不是QVector。
答案 1 :(得分:0)
The Qt documentation说说QStack
:
这是QVector的便利子类,提供“后进先出”(LIFO)语义。它将以下功能添加到QVector中已经存在的功能中:push(),pop()和top()。
正如David所指出的,您可以像遍历QStack
一样遍历QVector
中的条目:
QStack <int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
for (int i : stack)
{
std::cout << i << "\n";
}
顺便说一句:standard library's documentation带有类似的页面,描述了其容器的属性-这些页面通常在决定使用哪个容器时非常有用。