Namespaces
Variants

std::ranges::move, std::ranges::move_result

С сайта ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Немодифицирующие операции над последовательностями    
Пакетные операции
(C++17)
Операции поиска
Модифицирующие операции над последовательностями
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции порождения
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и смежные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции над кучами
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Немодифицирующие операции над последовательностями
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
Операции бинарного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции над кучами
Операции минимума/максимума
       
       
Операции перестановок
Операции свёртки
Операции над неинициализированной памятью
Типы возврата
 
Определён в заголовке <algorithm>
Сигнатура вызова
template< std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O >
requires std::indirectly_movable<I, O>
constexpr move_result<I, O>
    move( I first, S last, O result );
(1) (начиная с C++20)
template< ranges::input_range R, std::weakly_incrementable O >
requires std::indirectly_movable<ranges::iterator_t<R>, O>
constexpr move_result<ranges::borrowed_iterator_t<R>, O>
    move( R&& r, O result );
(2) (начиная с C++20)
Вспомогательные типы
template< class I, class O >
using move_result = ranges::in_out_result<I, O>;
(3) (начиная с C++20)
1) Перемещает элементы диапазона, определённого как [first, last), в другой диапазон, начиная с result. Поведение не определено, если result находится в пределах диапазона [first, last). В таком случае вместо него может использоваться ranges::move_backward.
2) То же, что и (1), но использует r в качестве исходного диапазона, как если бы ranges::begin(r) использовалось как first, а ranges::end(r) — как last.

Элементы в диапазоне «перемещено из» по-прежнему будут содержать допустимые значения соответствующего типа, но не обязательно те же значения, что и до перемещения.

Сущности, подобные функциям, описанные на этой странице, являются объектами функций алгоритмов (неформально известными как niebloids), то есть:

Параметры

first, last - пара итератор-страж, определяющая диапазон перемещаемых элементов
r - диапазон перемещаемых элементов
result - начало целевого диапазона

Возвращаемое значение

{ last, result + N } , где

1) N = ranges:: distance ( first, last ) .
2) N = ranges:: distance ( r ) .

Сложность

Ровно N операций перемещающего присваивания.

Примечания

При перемещении перекрывающихся диапазонов, ranges::move следует использовать при перемещении влево (начало целевого диапазона находится вне исходного диапазона), тогда как ranges::move_backward следует использовать при перемещении вправо (конец целевого диапазона находится вне исходного диапазона).

Возможная реализация

struct move_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
    requires std::indirectly_movable<I, O>
    constexpr ranges::move_result<I, O>
        operator()(I first, S last, O result) const
    {
        for (; first != last; ++first, ++result)
            *result = ranges::iter_move(first);
        return {std::move(first), std::move(result)};
    }
    template<ranges::input_range R, std::weakly_incrementable O>
    requires std::indirectly_movable<ranges::iterator_t<R>, O>
    constexpr ranges::move_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
    }
};
inline constexpr move_fn move {};

Пример

Следующий код перемещает объекты потоков (которые сами по себе являются некопируемыми ) из одного контейнера в другой.

#include <algorithm>
#include <chrono>
#include <iostream>
#include <iterator>
#include <list>
#include <thread>
#include <vector>
using namespace std::literals::chrono_literals;
void f(std::chrono::milliseconds n)
{
    std::this_thread::sleep_for(n);
    std::cout << "thread with n=" << n.count() << "ms ended" << std::endl;
}
int main()
{
    std::vector<std::jthread> v;
    v.emplace_back(f, 400ms);
    v.emplace_back(f, 600ms);
    v.emplace_back(f, 800ms);
    std::list<std::jthread> l;
    // std::ranges::copy() would not compile, because std::jthread is non-copyable
    std::ranges::move(v, std::back_inserter(l));
}

Вывод:

thread with n=400ms ended
thread with n=600ms ended
thread with n=800ms ended

Смотрите также

перемещает диапазон элементов в новое место в обратном порядке
(объект-функция алгоритма)
копирует диапазон элементов в новое место
(объект-функция алгоритма)
копирует диапазон элементов в обратном порядке
(объект-функция алгоритма)
(C++11)
перемещает диапазон элементов в новое место
(шаблон функции)
(C++11)
преобразует аргумент в xvalue
(шаблон функции)