std:: move_iterator
|
Определено в заголовочном файле
<iterator>
|
||
|
template
<
class
Iter
>
class move_iterator ; |
(начиная с C++11) | |
std::move_iterator
— это адаптер итератора, который ведет себя точно так же, как базовый итератор (который должен быть как минимум
LegacyInputIterator
или моделировать
input_iterator
(начиная с C++20)
, или более строгую концепцию итератора
(начиная с C++23)
), за исключением того, что разыменование преобразует значение, возвращаемое базовым итератором, в rvalue. Если этот итератор используется как входной итератор, эффект заключается в том, что значения перемещаются, а не копируются.
Содержание |
Вложенные типы
|
(до C++20) | ||||||||||||||||||||
|
(начиная с 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++20)
|
сравнивает базовый итератор и базовый сторожевой элемент
(шаблон функции) |
|
(C++11)
|
продвигает итератор
(шаблон функции) |
|
(C++11)
|
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции) |
|
(C++20)
|
вычисляет расстояние между базовым итератором и базовым сторожевым элементом
(шаблон функции) |
|
(C++20)
|
преобразует результат разыменования базового итератора в соответствующий тип rvalue-ссылки
(функция) |
|
(C++20)
|
обменивает объекты, на которые указывают два базовых итератора
(шаблон функции) |
|
(C++11)
|
создаёт
std::move_iterator
с типом, выведенным из аргумента
(шаблон функции) |
Вспомогательные шаблоны
|
template
<
class
Iterator1,
class
Iterator2
>
requires
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(начиная с 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
не
определён в этом случае |
Смотрите также
|
(C++11)
|
создаёт
std::move_iterator
с типом, выведенным из аргумента
(шаблон функции) |
|
(C++20)
|
адаптер стража для
std::move_iterator
(шаблон класса) |