Как я могу скопировать весь вектор в очередь? - PullRequest
8 голосов
/ 17 ноября 2011

Я хочу скопировать все содержимое вектора в очередь в C ++. Это встроенная функция или необходимо зацикливаться на каждом элементе?

Ответы [ 3 ]

14 голосов
/ 17 ноября 2011

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

std::vector<int> v = get_vector();

std::queue<long int, std::deque<long int>> q(std::deque<long int>(v.begin(),
                                                                  v.end()));

(Вы можете изменить базовый контейнер по вкусу, хотя deque, вероятно, лучший.)

Если очередь уже существует, то нет алгоритма на основе диапазона, однако вы можете легко написать свой собственный:

template <typename Iter, typename Q>
push_range(Q & q, Iter begin, Iter end)
{
    for ( ; begin != end; ++begin)
        q.push(*begin);
}

В качестве отступления: если ваш алгоритм требует такой степени гибкости, вы, вероятно, лучшепросто использовать std::deque в первую очередь.Контейнерные адаптеры (queue и stack) следует использовать только в том случае, если вы хотите явно сказать «это поведение, которое я хочу» (т.е. push / pop).

6 голосов
/ 17 ноября 2011

Вероятно, лучший способ - это непосредственно помещать элементы в очередь.

std::vector<T> v;
...
std::queue<T> q;
for (const auto& e: v)
  q.push(e)

Даже использование std :: copy утомительно, так как вам нужно обернуть очередь в адаптер ( Вставить вОчередь STL с использованием std :: copy ).

2 голосов
/ 17 ноября 2011

Конструктор очереди выглядит следующим образом:

explicit queue ( const Container& ctnr = Container() );

Таким образом, вы можете получить вектор v и построить из него очередь.

vector<int> v;
deque<int> d;
/* some random magic code goes here */
queue<int, deque<int>> q(d(v));

Однако вы не можете сделать это для элементов push_back в уже инициализированном q. Вы можете использовать другой Контейнер, очистить свою очередь, добавить свой вектор в этот контейнер и создать новую очередь из этого вектора; но я бы повторил, а не делал все это.

Окончательный ответ: Нет, такой метод не реализован для очередей, вы можете использовать deque или итерировать свой вектор.

...