контейнер очереди С++

У меня проблема с очередями в моей программе. Имея одну очередь, я хотел бы использовать эту очередь, только с другим идентификатором. Вот что у меня есть сейчас:

queue<R> queue;
queue<R> queue2;
...
while (! queue2.empty() )
{
  R r = queue2.front();
  queue2.pop();
  queue.push(r);
}

Но это линейно. Я надеюсь, что это можно сделать за время O(1). Я пытался использовать ссылки, но мне это не удалось.


person JosephConrad    schedule 15.01.2012    source источник
comment
Что вы имеете в виду в O (1) раз? Поместить все элементы из q2 в q1? Или что-то другое?   -  person BЈовић    schedule 16.01.2012
comment
Что вы пробовали, что не удалось?   -  person Oliver Charlesworth    schedule 16.01.2012
comment
Зачем вообще менять имя?   -  person GManNickG    schedule 16.01.2012
comment
stackoverflow.com/questions/937621/ - иначе я бы сказал queue.swap(queue2);   -  person John Zwinck    schedule 16.01.2012
comment
Пробовал так: queue = queue2 и queue = &queue2. Но это было нехорошо. Я хотел бы избежать копирования всех элементов, потому что в моей программе это занимает много времени.   -  person JosephConrad    schedule 16.01.2012
comment
Вы можете использовать С++ 11 или нет? Рассмотрите просто использование std::list, что позволит вам сделать list1.swap(list2) - вы все равно можете использовать его как очередь.   -  person John Zwinck    schedule 16.01.2012
comment
@JohnZwinck: Маловероятно, что простая смена контейнеров на ходу - это правильно.   -  person Lightness Races in Orbit    schedule 16.01.2012
comment
@JohnZwinck: И даже если бы это было так, std::list - худший контейнер. Используйте std::deque здесь.   -  person GManNickG    schedule 16.01.2012


Ответы (2)


Вы не сказали нам, как вы «потерпели неудачу», но ссылки действительно просты:

std::queue<R> queue;
std::queue<R>& queue2 = queue;

Работа выполнена.

person Lightness Races in Orbit    schedule 15.01.2012

Вы можете использовать бесплатную функцию std::swap:

std::queue<R> queue2;
std::swap(queue1, queue2);

Это просто вызывает swap для базового контейнера, поэтому он должен быть достаточно эффективным.

(Согласно связанному вопросу Джона Цвинка, это новая функция C++11, поэтому старые компиляторы могут отклонить ее или иметь неэффективную реализацию.)

person Kerrek SB    schedule 15.01.2012