Почему стандартная очередь не определяет специализацию метода подкачки

Я читал, что все контейнеры stl предоставляют специализацию алгоритма подкачки, чтобы избежать вызова конструктора копирования и двух операций присваивания, которые использует метод по умолчанию. Однако, когда я подумал, что было бы неплохо использовать очередь в каком-то коде, над которым я работал, я заметил, что (в отличие от vector и deque) очередь не предоставляет этот метод? Я просто решил использовать deque вместо очереди, но все же мне интересно узнать, почему это так?


person Jamie Cook    schedule 02.06.2009    source источник


Ответы (2)


C++0x добавит переключитесь на адаптеры контейнеров, такие как std::queue. Я мог только догадываться, почему он отсутствует в текущем стандарте. В этом обсуждении кто-то предлагает обходной путь:

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

person lothar    schedule 02.06.2009
comment
Вопрос был в том, есть ли причина, по которой он отсутствует? - person Jamie Cook; 02.06.2009

Я уверен, что они были опущены по недосмотру. Честно говоря, я довольно часто использую std::queue и std::stack, и мне никогда не приходилось менять их местами. Я думаю, что вы используете deque вместо очереди. Что-то вроде typedef std::deque<MyType> QueueType должно дать достаточно подсказки, как следует использовать контейнер.

person rlbond    schedule 02.06.2009
comment
Я поддерживаю два набора элементов, требующих обработки: текущий набор и набор для обработки в следующем раунде, поэтому мне нужно поменять местами заполненный nextQueue вместо истощенного currentQueue в конце каждого раунда. Строго говоря, они вовсе не обязательно должны быть очередями... на самом деле они могут быть просто векторами... хммм - person Jamie Cook; 02.06.2009
comment
Рассматривали ли вы наличие двух указателей на очереди и замену их местами? - person rlbond; 02.06.2009
comment
@rlbond Когда метод подкачки определен правильно, контейнеры просто меняют местами свои внутренние указатели, так что это фактически одно и то же ... и я ненавижу использовать vector‹blah›* vec = new vector(bar); Я просто думаю, что это некрасиво :) - person Jamie Cook; 03.06.2009
comment
@ Джейми, на самом деле тебе не обязательно этого делать, ты можешь сказать vector‹blah› a, b; вектор‹blah›* текущий = - person rlbond; 09.07.2009