Daily bit(e) C++. std::move_iterator

Добавлено 24 июля 2026 в 20:50

Daily bit(e) C++ 43, адаптер итератора, который разыменовывает в r-значение: std::move_iterator.

Daily bit(e) C++

Эффективное перемещение данных (до C++23) при работе с гетерогенными контейнерами может быть сложной задачей, поскольку конструкторы перемещения и присваивание перемещением поддерживаются только контейнерами одного типа.

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

std::move_iterator работает точно так же, как и базовый итератор, за исключением того, что при разыменовании он возвращает r-значение.

#include <vector>
#include <list>
#include <iterator>
#include <memory>

struct MyClass {};
std::vector<std::unique_ptr<MyClass>> get_elements();


std::vector<std::unique_ptr<MyClass>> src = get_elements();

// Не скомпилируется: несовместимый тип
std::list<std::unique_ptr<MyClass>> err1(std::move(src));

// Не скомпилируется: std::unique_ptr не копируемый
std::list<std::unique_ptr<MyClass>> err2(src.begin(), src.end());

// OK
std::list<std::unique_ptr<MyClass>> dst(
    std::move_iterator(src.begin()),
    std::move_iterator(src.end())
);

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++ИтераторПрограммирование