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

std::move

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last, OutputIt d_first );
(начиная с C++11)

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

Содержание

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

first, last - диапазон элементов для перемещения
d_first - начало целевого диапазона. Если d_first находится внутри [first, last), следует использовать 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 завершился

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

перемещает диапазон элементов в новое место в обратном порядке
Оригинал:
moves a range of elements to a new location in backwards order
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон функции) [edit]