Как мне переместить-добавить один std :: vector в другой? - PullRequest
3 голосов
/ 02 мая 2020

Предположим, у меня есть std::vector<T> from и std::vector<T> to, где T - это не копируемый, но перемещаемый тип, а to может быть или не быть пустым. Я хочу, чтобы все элементы в from добавлялись после to.

Если я использую перегрузку std::vector<T>::insert(const_iterator pos, InputIt first, InputIt last) (4) с pos = to.end(), он попытается скопировать все объекты.

Теперь, если to.empty(), я мог бы просто std::move(from), а в противном случае я мог бы сначала from.reserve(from.size()+to.size()), а затем вручную to.emplace_back(std::move(from[i])) каждый элемент from и, наконец, from.clear().

Есть ли прямой способ сделать это с помощью std вспомогательной функции или оболочки?

Ответы [ 3 ]

4 голосов
/ 02 мая 2020

insert будет нормально работать с std :: move_iterator и std :: make_move_iterator вспомогательная функция:

to.insert(to.end(),std::make_move_iterator(from.begin()),
    std::make_move_iterator(from.end()));
1 голос
/ 02 мая 2020

Возможно, вы захотите рассмотреть алгоритм std::move() , т. Е. Движущийся аналог std::copy() - вместо std::move() функция удобного шаблона:

#include <vector>
#include <algorithm>

struct OnlyMovable {
   OnlyMovable() = default;
   OnlyMovable(const OnlyMovable&) = delete;
   OnlyMovable(OnlyMovable&&) = default;
};

auto main() -> int {
   std::vector<OnlyMovable> from(5), to(3);
   std::move(from.begin(), from.end(), std::back_inserter(to)); 
}
1 голос
/ 02 мая 2020
#include<iterator>

std::vector<T> source = {...};

std::vector<T> destination;

std::move(source.begin(), source.end(), std::back_inserter(destination));
...