Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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
(публичная функция-член)
Наследуется от std::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 если его базовое представление является таковым

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

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