Подтвердить что ты не робот

"перемещать" два вектора вместе

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

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?

4b9b3361

Ответ 1

Да, используйте 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);

Ответ 2

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

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

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

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

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