Пространства имён
Варианты
Действия

std::move

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
(C++11)
move
(C++11)
(C++20)(C++20)
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last, OutputIt d_first );
(начиная с C++11)

Перемещает элементы из диапазона [firstlast) в другой диапазон, начинающийся с d_first. После этой операции элементы в перемещенном диапазоне будут по-прежнему содержать валидные значения соответствующего типа, но не обязательно те же самые, что и до перемещения.

Содержание

[править] Параметры

[firstlast) два итератора задающих диапазон элементов для перемещения
d_first начало целевого диапазона. Если d_first находится внутри [firstlast), следует использовать std::move_backward вместо std::move
Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.
-
OutputIt должен со��тветствовать требованиям OutputIterator.

[править] Возвращаемое значение

Output-итератор на элемент, следующий за последним перемещённым элементом (d_first + (last - first)).

[править] Сложность

Ровно last - first присваиваний перемещения.

[править] Возможная реализация

template<class InputIt, class OutputIt>
OutputIt move(InputIt first, InputIt last,
                    OutputIt d_first)
{
    while (first != last) {
        *d_first++ = std::move(*first++);
    }
    return d_first;
}

[править] Пример

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

#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <thread>
#include <chrono>
 
void f(int n)
{
    std::this_thread::sleep_for(std::chrono::seconds(n));
    std::cout << "поток " << n << " завершился" << '\n';
}
 
int main()
{
    std::vector<std::thread> v;
    v.emplace_back(f, 1);
    v.emplace_back(f, 2);
    v.emplace_back(f, 3);
    std::list<std::thread> l;
    // copy() не скомпилировалось бы, так как std::thread — некопируемый
    std::move(v.begin(), v.end(), std::back_inserter(l)); 
    for(auto& t : l) t.join();
}

Вывод:

поток 1 завершился
поток 2 завершился
поток 3 завершился

[править] См. также

перемещает диапазон элементов в новое место в обратном порядке
(шаблон функции) [править]