Spec-Zone.ru › C++

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

std::iterator_traits<Iter>::iterator_category

(до C++20)

Если std::iterator_traits<Iter>::iterator_category допустимо и обозначает тип:

  • если std::iterator_traits<Iter>::iterator_category соответствует std::derived_from<std::random_access_iterator_tag>, член iterator_category является std::random_access_iterator_tag.
  • В противном случае, член iterator_category имеет тот же тип, что и std::iterator_traits<Iter>::iterator_category.

В противном случае, члена iterator_category нет.

(с C++20)
iterator_concept

std::input_iterator_tag

(с C++20)
(до C++23)
  • std::random_access_iterator_tag, если Iter соответствует
    std::random_access_iterator. В противном случае,
  • std::bidirectional_iterator_tag, если Iter соответствует
    std::bidirectional_iterator. В противном случае,
  • std::forward_iterator_tag, если Iter соответствует
    std::forward_iterator. В противном случае,
  • std::input_iterator_tag.
(с C++23)
value_type

std::iterator_traits<Iter>::value_type

(до C++20)

std::iter_value_t<Iter>

(с C++20)
difference_type

std::iterator_traits<Iter>::difference_type

(до C++20)

std::iter_difference_t<Iter>

(с C++20)
pointer Iter
reference

Если std::iterator_traits<Iter>::reference является ссылкой, это версия rvalue-ссылки того же типа. В противном случае (например, если обернутый итератор возвращает значение по значению), это std::iterator_traits<Iter>::reference без изменений.

(до C++20)

std::iter_rvalue_reference_t<Iter>

(с C++20)

Члены-объекты

Название члена Определение
current (private) базовый итератор, из которого base() копирует или перемещает(с C++20)
(только для иллюстрации*)

Члены-функции

(конструктор)
(C++11)
создает новый адаптер итератора
(публичная функция-член)
operator=
(C++11)
присваивает другой адаптер итератора
(публичная функция-член)
base
(C++11)
доступ к базовому итератору
(публичная функция-член)
operator*operator->
(C++11)(C++11)(устарело в C++20)
доступ к элементу, на который указывает итератор
(публичная функция-член)
operator[]
(C++11)
доступ к элементу по индексу
(публичная функция-член)
operator++operator++(int)operator+=operator+operator--operator--(int)operator-=operator-
(C++11)
продвигает или уменьшает итератор
(публичная функция-член)

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

operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
сравнивает базовые итераторы
(шаблон функции)
operator==(std::move_sentinel)
(C++20)
сравнивает базовый итератор и базовый конечный итератор
(шаблон функции)
operator+
(C++11)
перемещает итератор
(шаблон функции)
operator-
(C++11)
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)
operator-(std::move_sentinel)
(C++20)
вычисляет расстояние между базовым итератором и базовым конечным итератором
(шаблон функции)
iter_move
(C++20)
преобразует результат обращения к элементу базового итератора в ассоциированный тип ссылки правого значения
(функция)
iter_swap
(C++20)
меняет местами объекты, на которые ссылаются два базовых итератора
(шаблон функции)
make_move_iterator
(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 существует

См. также

make_move_iterator
(C++11)
создаёт std::move_iterator типа, определяемого из аргумента
(шаблон функции)
move_sentinel
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API