Namespaces
Variants

std::ranges::views::common, std::ranges::common_view

с сайта ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовочном файле <ranges>
template< ranges::view V >
    requires (not ranges::common_range<V> and
              std::copyable<ranges::iterator_t<V>>)
class common_view
    : public ranges::view_interface<common_view<V>>
(1) (начиная с C++20)
namespace views {
    inline constexpr /* unspecified */ common = /* unspecified */;
}
(2) (начиная с C++20)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto common( R&& r );
(начиная с C++20)
1) Адаптирует данный view с разными типами для пары итератор/страж в view, который также является common_range. common_view всегда имеет одинаковые типы итератора и стража.
2) RangeAdaptorObject. Пусть e будет подвыражением. Тогда выражение views::common(e) является выражение-эквивалентным для:
  • views::all(e), если это правильное выражение и decltype((e)) удовлетворяет концепту common_range;
  • common_view{e} в противном случае.

Члены данных

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

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

конструирует common_view
(публичная функция-член)
возвращает копию базового (адаптированного) представления
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор на конец
(публичная функция-член)
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(публичная функция-член)
возвращает приблизительный размер результирующего approximately_sized_range
(публичная функция-член)
Унаследовано от ranges::view_interface
возвращает, является ли производное представление пустым, предоставляется только если оно удовлетворяет sized_range или forward_range
(открытая функция-элемент std::ranges::view_interface<D>)
(C++23)
возвращает постоянный итератор на начало диапазона
(открытая функция-элемент std::ranges::view_interface<D>)
(C++23)
возвращает страж для постоянного итератора диапазона
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает, является ли производное представление непустым, предоставляется только если ranges::empty применим к нему
(открытая функция-элемент std::ranges::view_interface<D>)
получает адрес данных производного представления, предоставляется только если тип его итератора удовлетворяет contiguous_iterator
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет forward_range
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, предоставляется только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает n-й элемент в производном представлении, предоставляется только если оно удовлетворяет random_access_range
(открытая функция-элемент std::ranges::view_interface<D>)

Руководства по выводу

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

template < class T >

constexpr bool enable_borrowed_range < std :: ranges :: common_view < T >> =

ranges:: enable_borrowed_range < T > ;
(начиная с C++20)

Эта специализация ranges::enable_borrowed_range позволяет common_view удовлетворять требованиям borrowed_range , когда базовое представление удовлетворяет им.

Примечания

common_view может быть полезен для работы с устаревшими алгоритмами, которые ожидают, что итератор и стражник будут одного типа.

Пример

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <list>
#include <numeric>
#include <ranges>
int main()
{
    auto v1 = {1, 2, 3, 4, 5};
    auto i1 = std::counted_iterator{v1.begin(), std::ssize(v1)};
    auto r1 = std::ranges::subrange{i1, std::default_sentinel};
//  auto e1 = std::accumulate(r1.begin(), r1.end(), 0); // ошибка: требуется "common range"
    auto c1 = std::ranges::common_view{r1};
    std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n';
    // унаследовано от ranges::view_interface:
    std::cout << "c1.front(): " << c1.front() << '\n';
    std::cout << "c1.back(): " << c1.back() << '\n';
    std::cout << "c1.data(): " << c1.data() << '\n';
    std::cout << "c1[0]: " << c1[0] << '\n';
    auto v2 = std::list{1, 2, 3, 4, 5};
    auto i2 = std::counted_iterator{v2.begin(), std::ssize(v2)};
    auto r2 = std::ranges::subrange{i2, std::default_sentinel};
//  auto e2 = std::accumulate(r2.begin(), r2.end(), 0); // ошибка: требуется "common range"
    auto c2 = std::ranges::common_view{ r2 };
    std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n';
    // унаследовано от ranges::view_interface:
    std::cout << "c2.front(): " << c2.front() << '\n';
//  auto e3 = c2.back(); // ошибка: требуется "bidirectional range"
//  auto e4 = c2.data(); // ошибка: требуется "contiguous range"
//  auto e5 = c2[0];     // ошибка: требуется "random access range"
}

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

accumulate: 15
c1.front(): 1
c1.back(): 5
c1.data(): 0x7f19937f00d0
c1[0]: 1
accumulate: 15
c2.front(): 1

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3494 C++20 common_view никогда не был borrowed_range он является borrowed_range если его базовое представление является таковым

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

определяет, что диапазон имеет идентичные типы итератора и сторожа
(концепт)
адаптирует тип итератора и его сторож в общий тип итератора
(шаблон класса)