Какова цель существования контейнера QQueue?

Я начал работать с Qt некоторое время назад и использовал QQueue. в качестве замены для std::queue. Хотя сегодня я понял, что могу использовать pop_front, pop_back, push_front и push_back из QList класс на объекте QQueue. Задаваясь вопросом, почему вы можете использовать эти функции (особенно pop_back и push_front) в очереди, я проверил документацию Qt и понял, что QQueue наследует QList.

Для меня основной интерес очереди состоит в том, чтобы действовать как очередь: ставить вещи в очередь в конце и удалять из очереди в начале. Но когда я продолжил читать документацию, я понял, что постановка в очередь и dequeue были просто эквивалентами добавлять и takeFirst класса QList. Даже функция head идентична функции первая функция QList. Кроме того, возможность использовать такие функции, как pop_back и push_front, полностью ломает для меня изначальную логику очереди, а сама документация представляет класс QQueue как контейнер очереди:

Класс QQueue — это универсальный контейнер, предоставляющий очередь.

QQueue — это один из универсальных классов контейнеров Qt. Он реализует структуру данных очереди для элементов одного типа.

Очередь — это структура «первым пришел — первым обслужен» (FIFO). Элементы добавляются в хвост очереди с помощью enqueue() и извлекаются из головы с помощью dequeue(). Функция head() обеспечивает доступ к элементу заголовка, не удаляя его.

Есть ли что-то, что я упускаю из виду о цели существования класса QQueue? Под этим я подразумеваю, почему этот контейнер очереди был создан, чтобы он мог делать больше, чем должна делать очередь? И поскольку класс QQueue, кажется, может работать точно так же, как QList, есть ли какая-то причина использовать QQueue вместо QList?


person Isuka    schedule 10.04.2017    source источник


Ответы (2)


Как указано в описании контейнеров:

QStack и QQueue — это удобные классы, которые обеспечивают LIFO и FIFO семантика.

Единственная разница заключается в упомянутых вами дополнительных методах:

Суть в более подходящем семантически и интуитивном именовании методов.

В противном случае:

  • QQueue идентичен своему базовому классу QList.
  • QStack идентичен своему базовому классу QVector.

Убедитесь сами, взгляните на исходный код — ничего лишнего в этих классах нет:

person kefir500    schedule 10.04.2017
comment
Есть не очень тонкое, но важное отличие: QQueue — это QList, QStack — это QVector. - person peppe; 10.04.2017
comment
Если вы собираетесь прояснить это, было бы неплохо также включить ответвления QList. - person dtech; 10.04.2017
comment
как вы думаете, почему QQueue наследуется от QList, а `QStack` наследуется от QVector? я не понимаю, почему оба не могли быть QList. - person user3132457; 10.12.2019

Сам QQueue наследуется от QList и просто добавляет несколько методов, уже присутствующих в QList под разными именами. Нет смысла использовать его, кроме синтаксического сахара.

person dtech    schedule 10.04.2017