Namespaces
Variants

std:: move_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовочном файле <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 std:: iterator_traits < Iter > :: iterator_category
value_type std:: iterator_traits < Iter > :: value_type
difference_type std:: iterator_traits < Iter > :: difference_type
pointer Iter
reference
(до C++20)
Тип Определение
iterator_type Iter
iterator_category
(условно присутствует)
iterator_concept

std::input_iterator_tag

(до C++23)
(начиная с C++23)
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer Iter
reference std:: iter_rvalue_reference_t < Iter >
(начиная с C++20)

Члены данных

Участник Описание
Iter current базовый итератор
( объект-член только для демонстрации* )

Функции-члены

создает новый move_iterator
(public member function)
присваивает другой move_iterator
(public member function)
получает доступ к базовому итератору
(public member function)
получает доступ к указываемому элементу
(public member function)
получает доступ к элементу по индексу
(public member function)
перемещает вперед или назад move_iterator
(public member function)

Функции, не являющиеся членами класса

(C++11) (C++11) (удалено в C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
сравнивает базовые итераторы
(шаблон функции)
сравнивает базовый итератор и базовый сторожевой элемент
(шаблон функции)
(C++11)
продвигает итератор
(шаблон функции)
(C++11)
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)
вычисляет расстояние между базовым итератором и базовым сторожевым элементом
(шаблон функции)
(C++20)
преобразует результат разыменования базового итератора в соответствующий тип rvalue-ссылки
(функция)
(C++20)
обменивает объекты, на которые указывают два базовых итератора
(шаблон функции)
создаёт 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 если их базовые итераторы не удовлетворяют этой концепции.

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_move_iterator_concept 202207L (C++23) Сделать std :: move_iterator < T * > итератором произвольного доступа

Пример

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>
void print(const std::string_view rem, const auto& v)
{
    std::cout << rem;
    for (const auto& s : v)
        std::cout << std::quoted(s) << ' ';
    std::cout << '\n';
};
int main()
{
    std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "example"};
    print("Old contents of the vector: ", v);
    std::string concat;
    for (auto begin = std::make_move_iterator(v.begin()),
              end = std::make_move_iterator(v.end());
         begin != end; ++begin)
    {
        std::string temp{*begin}; // moves the contents of *begin to temp
        concat += temp;
    }
    // Starting from C++17, which introduced class template argument deduction,
    // the constructor of std::move_iterator can be used directly:
    // std::string concat = std::accumulate(std::move_iterator(v.begin()),
    //                                      std::move_iterator(v.end()),
    //                                      std::string());
    print("New contents of the vector: ", v);
    print("Concatenated as string: ", std::ranges::single_view(concat));
}

Возможный вывод:

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 могло возвращать висячую ссылку
если разыменование базового итератора возвращает prvalue
возвращает
объект вместо этого
LWG 3736 C++20 move_iterator не имел специализации disable_sized_sentinel_for добавлено
P2259R1 C++20 член iterator_category был определён даже если
std:: iterator_traits < Iter > :: iterator_category не определён
iterator_category не
определён в этом случае

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

создаёт std::move_iterator с типом, выведенным из аргумента
(шаблон функции)
адаптер стража для std::move_iterator
(шаблон класса)