Диапазон на основе цикла для перемещения объектов в другой контейнер? - PullRequest
0 голосов
/ 15 октября 2019

В идеале я бы хотел сделать что-то подобное, но это безопасно / правильно? При переходе от some_list к other_list вы редактируете содержимое some_list, и каждая последующая итерация становится недействительной, поскольку все объекты содержат нулевое содержимое.

for (auto& object : some_list) {
    other_list.emplace_back(std::move(object));
}

Можно ли как-нибудь сделать этот код болееэффективнее / безопаснее / лучше или это лучший способ, которым я могу это сделать?

1 Ответ

1 голос
/ 15 октября 2019

Простое изменение содержащихся объектов не делает итераторов недействительными, поэтому этот код безопасен. Однако нет необходимости самим писать цикл, поскольку есть алгоритм std::move:

#include <algorithm>
#include <iterator>

template<typename InContainer, typename OutContainer>
void append_back(InContainer& some_list, OutContainer& other_list)
{
    using std::begin;
    using std::end;
    std::move(begin(some_list), end(some_list), std::back_inserter(other_list);
    some_list.clear();
}
...