Spec-Zone.ru › C++

std::common_iterator

Определён в заголовочном файле <iterator>
template< std::input_or_output_iterator I, std::sentinel_for<I> S >
    requires ( !std::same_as<I, S> && std::copyable<I> )
class common_iterator;
(начиная с C++20)

std::common_iterator — это адаптер итератора I / сентинела S, который может представлять необщий диапазон (в котором типы I и S различаются) как common_range, храня либо итератор, либо сентинел и определяя соответствующие операторы сравнения на равенство operator==.

std::common_iterator можно использовать как «мост» между последовательностями, представленными парой итератор/сентинел, и устаревшими функциями, которые ожидают последовательности наподобие common_range.

Поля данных

Имя поля Определение
var объект типа std::variant<I,S>
(объект-член, используемый только для описания)

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

(constructor)
создаёт новый common_iterator
(открытая функция-член)
operator=
присваивает другой common_iterator
(открытая функция-член)
operator*operator->
получает доступ к элементу, на который указывает итератор
(открытая функция-член)
operator++operator++(int)
перемещает common_iterator вперёд
(открытая функция-член)

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

operator==
(C++20)
сравнивает базовые итераторы или сентинелы
(шаблон функции)
operator-
(C++20)
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)
iter_move
(C++20)
приводит результат разыменования базового итератора к соответствующему ему типу rvalue-ссылки
(функция)
iter_swap
(C++20)
обменивает местами объекты, на которые указывают два базовых итератора
(шаблон функции)

Вспомогательные классы

std::incrementable_traits<std::common_iterator>
(C++20)
вычисляет соответствующий тип разности для типа std::common_iterator
(специализация шаблона класса)
std::iterator_traits<std::common_iterator>
(C++20)
предоставляет единый интерфейс к свойствам типа std::common_iterator
(специализация шаблона класса)

Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <string>

template<class ForwardIter>
void fire(ForwardIter first, ForwardIter last)
{
    std::copy(first, last, std::ostream_iterator<std::string>{std::cout, " "});    
}

int main()
{
    std::list<std::string> stars{"Pollux", "Arcturus", "Mira", "Aldebaran", "Sun"};

    using IT = std::common_iterator<
                   std::counted_iterator<std::list<std::string>::iterator>,
                   std::default_sentinel_t>;

    fire(IT(std::counted_iterator(stars.begin(), stars.size() - 1)),
         IT(std::default_sentinel));
}

Вывод:

Pollux Arcturus Mira Aldebaran

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 23.5.5 Общие итераторы [iterators.common]
  • Стандарт C++20 (ISO/IEC 14882:2020):
    • 23.5.4 Общие итераторы [iterators.common]

См. также

ranges::common_range
(C++20)
задаёт требование, согласно которому диапазон имеет одинаковые типы итератора и сентинела
(концепт)
ranges::common_viewviews::common
(C++20)
преобразует view в common_range
(шаблон класса) (объект-адаптер диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/common_iterator

Spec-Zone.ru

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