«сдвинуть» два вектора вместе - PullRequest
25 голосов
/ 20 марта 2012

Если у меня есть два вектора и я хочу объединить их в один, я могу сделать это следующим образом:

std::vector<T> a(100); // just some random size here
std::vector<T> b(100);

a.insert(std::end(a), std::begin(b), std::end(b));

Это предполагает копирование, чего я хочу избежать. Есть ли способ использовать семантику перемещения, чтобы собрать их вместе?
Я очень сомневаюсь в этом, поскольку vector должен быть смежным. Однако есть ли способ сделать это с deque?

Ответы [ 2 ]

49 голосов
/ 20 марта 2012

Да, используйте std::move:

#include <algorithm>
std::move(b.begin(), b.end(), std::back_inserter(a));

В качестве альтернативы вы можете использовать итераторы перемещения:

a.insert(a.end(),
         std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));

Не забудьте #include <iterator> в обоих случаях, и прежде чем начать,скажем:

a.reserve(a.size() + b.size());

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

std::size_t n = a.size();
a.resize(a.size() + b.size());
std::move(b.begin(), b.end(), a.begin() + n);
7 голосов
/ 20 марта 2012

Зависит от того, что именно вы хотите переместить.Когда вы перемещаете вектор, это делается путем эффективной замены внутреннего указателя массива.Таким образом, вы можете указать один вектор на массиве, ранее принадлежавшем другому вектору.

Но это не позволит вам объединить два вектора.

Лучшее, что вы можете сделать, это переместить каждого отдельного человека.Элемент-член, как показано в ответе Керрека:

std::move(b.begin(), b.end(), std::back_inserter(a));

Опять же, это будет повторять вектор и перемещать каждый элемент к целевому вектору.

...