std::move_iterator
Определено в заголовке <iterator> | ||
|---|---|---|
template< class Iter > class move_iterator; | (с C++11) |
std::move_iterator является адаптером итератора, который ведет себя точно так же, как и базовый итератор (который должен быть по крайней мере LegacyInputIterator или модель input_iterator(с C++20), или более сильный концепции итератора(с C++23)), за исключением того, что обращение к элементу преобразует значение, возвращаемое базовым итератором, в rvalue. Если этот итератор используется как входной итератор, то эффект заключается в перемещении значений, а не копировании.
Типы членов
| Тип члена | Определение | ||||
|---|---|---|---|---|---|
iterator_type | Iter |
||||
iterator_category |
|
||||
iterator_concept |
|
||||
value_type |
|
||||
difference_type |
|
||||
pointer | Iter |
||||
reference |
|
Члены-объекты
| Название члена | Определение |
|---|---|
current (private) | базовый итератор, из которого base() копирует или перемещает(с C++20)(только для иллюстрации*) |
Члены-функции
|
(C++11) | создает новый адаптер итератора (публичная функция-член) |
|
(C++11) | присваивает другой адаптер итератора (публичная функция-член) |
|
(C++11) | доступ к базовому итератору (публичная функция-член) |
|
(C++11)(C++11)(устарело в C++20) | доступ к элементу, на который указывает итератор (публичная функция-член) |
|
(C++11) | доступ к элементу по индексу (публичная функция-член) |
|
(C++11) | продвигает или уменьшает итератор (публичная функция-член) |
Функции, не являющиеся членами
|
(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20) | сравнивает базовые итераторы (шаблон функции) |
|
(C++20) | сравнивает базовый итератор и базовый конечный итератор (шаблон функции) |
|
(C++11) | перемещает итератор (шаблон функции) |
|
(C++11) | вычисляет расстояние между двумя адаптерами итераторов (шаблон функции) |
|
(C++20) | вычисляет расстояние между базовым итератором и базовым конечным итератором (шаблон функции) |
|
(C++20) | преобразует результат обращения к элементу базового итератора в ассоциированный тип ссылки правого значения (функция) |
|
(C++20) | меняет местами объекты, на которые ссылаются два базовых итератора (шаблон функции) |
|
(C++11) | создаёт std::move_iterator типа, определяемого из аргумента (шаблон функции) |
Вспомогательные шаблоны
template< class Iterator1, class Iterator2 >
requires (!std::sized_sentinel_for<Iterator1, Iterator2>)
constexpr bool disable_sized_sentinel_for<
std::move_iterator<Iterator1>,
std::move_iterator<Iterator2>> = true;
| (с C++20) |
Эта частичная специализация std::disable_sized_sentinel_for предотвращает специализации move_iterator от удовлетворения sized_sentinel_for, если их базовые итераторы не удовлетворяют концепции.
Примечания
| Макроинструкция для проверки наличия функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_lib_move_iterator_concept | 202207L | (C++23) | Сделать std::move_iterator<T*> итератором произвольного доступа |
Пример
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <numeric>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "example"};
auto print_v = [&](auto const rem)
{
std::cout << rem;
for (const auto& s : v)
std::cout << std::quoted(s) << ' ';
std::cout << '\n';
};
print_v("Old contents of the vector: ");
std::string concat = std::accumulate(std::make_move_iterator(v.begin()),
std::make_move_iterator(v.end()),
std::string());
// An alternative that uses std::move_iterator directly could be:
// using moviter_t = std::move_iterator<std::vector<std::string>::iterator>;
// std::string concat = std::accumulate(moviter_t(v.begin()),
// moviter_t(v.end()),
// std::string());
// Starting from C++17, which introduced class template argument deduction,
// the constructor of std::move_iterator can be used directly without
// template parameters in most cases:
// std::string concat = std::accumulate(std::move_iterator(v.begin()),
// std::move_iterator(v.end()),
// std::string());
print_v("New contents of the vector: ");
std::cout << "Concatenated as string: " << std::quoted(concat) << '\n';
}Возможный вывод:
Old contents of the vector: "this" "_" "is" "_" "an" "_" "example" New contents of the vector: "" "" "" "" "" "" "" Concatenated as string: "this_is_an_example"
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 2106 | C++11 | обращение к move_iterator могло вернуть висячую ссылкуесли обращение к базовому итератору возвращает правое значение | возвращает объект вместо этого |
| LWG 3736 | C++20 |
move_iterator отсутствует специализация disable_sized_sentinel_for | добавлена |
| P2259R1 | C++20 | член iterator_category всегда был определён | определён только еслиstd::iterator_traits<Iter>::iterator_category существует |
См. также
|
(C++11) | создаёт std::move_iterator типа, определяемого из аргумента (шаблон функции) |
|
(C++20) | адаптер конечного итератора для использования с std::move_iterator (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/move_iterator