Как я могу перебрать элементы объекта QStack? - PullRequest
0 голосов
/ 06 июня 2019

Я недавно начал использовать классы Qt в своем университете, и был впечатлен его эффективностью.Просматривая документацию, я нашел некоторую информацию о QStack и QQueue , оба эти класса полезны для проектов, которые я разрабатываю.

Однако я столкнулся с довольнозагадка: как я могу перебрать все элементы объекта QStack?

Например, скажем, я хочу перебрать элементы объекта stack в примере ниже ( извлечено из документации Qt о QStack ):

QStack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
while (!stack.isEmpty())
    cout << stack.pop() << endl;

Мне удалось это сделать, удалив каждый элемент стека по одному и сохранив их во временном списке, но этокажется ужасным способом решить эту проблему.Что еще я мог сделать?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

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 (Last In First Out) для предметов.Если вы перебираете их в каком-то определенном порядке, вы нарушаете порядок, предписанный стеком, и поэтому (очень вероятно) НЕ должны использовать стек в первую очередь.

PS Это было сосредоточено на QStack, ноТо же самое относится и к QQueue.Различия заключаются в том, что Queue обеспечивает упорядочение FIFO (первым пришел - первым обслужен), а в QT QQueue наследуется от QList, поэтому замените его на QList, а не QVector.

0 голосов
/ 06 июня 2019

Документация Qt говорит о QStack:

Это вспомогательный подкласс QVector, который предоставляет семантику «последний пришел, первый вышел» (LIFO).Он добавляет следующие функции к тем, которые уже присутствуют в QVector: push (), pop () и top ().

Как Дэвид указал, что вы можете перебирать записиQStack так же, как вы перебираете QVector:

QStack <int> stack;
stack.push(1);
stack.push(2);
stack.push(3);

for (int i : stack)
{
    std::cout << i << "\n";
}

Кстати: документация стандартной библиотеки поставляется с похожей страницей, описывающей свойства ее контейнеров - этистраницы обычно очень полезны при принятии решения о том, какой контейнер использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...