Spec-Zone.ru › C++

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

Определено в заголовке <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} в противном случае.

Члены данных

Название члена Определение
base_ (приватный) Базовое представление типа V.
(только для иллюстрации*)

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

(конструктор)
(C++20)
создаёт common_view
(публичный член-функция)
base
(C++20)
возвращает копию базового (преобразованного) представления
(публичный член-функция)
begin
(C++20)
возвращает итератор в начало
(публичный член-функция)
end
(C++20)
возвращает итератор в конец
(публичный член-функция)
size
(C++20)
возвращает количество элементов. Доступно только если базовое (преобразованное) представление удовлетворяет sized_range.
(публичный член-функция)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пусто ли производное представление. Доступно, если оно удовлетворяет sized_range или forward_range.
(публичный член-функция std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает постоянный итератор в начало представления.
(публичный член-функция std::ranges::view_interface<D>)
cend
(C++23)
возвращает сторож для постоянного итератора представления.
(публичный член-функция std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пусто ли производное представление. Доступно, если ranges::empty применимо к нему.
(публичный член-функция std::ranges::view_interface<D>)
data
(C++20)
получает адрес данных производного представления. Доступно, если его тип итератора удовлетворяет contiguous_iterator.
(публичный член-функция std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном представлении. Доступно, если оно удовлетворяет forward_range.
(публичный член-функция std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном представлении. Доступно, если оно удовлетворяет bidirectional_range и common_range.
(публичный член-функция std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном представлении. Доступно, если оно удовлетворяет random_access_range.
(публичный член-функция std::ranges::view_interface<D>)

Правила вывода

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

template< class T >
inline constexpr bool enable_borrowed_range<std::ranges::common_view<T>> =
    std::ranges::enable_borrowed_range<T>;
(с C++20)

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

Примечания

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

Пример

#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); // error: "common range" required
    auto c1 = std::ranges::common_view{r1};
    std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n';
 
    // inherited from 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); // error: "common range" required
    auto c2 = std::ranges::common_view{ r2 };
    std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n';
 
    // inherited from ranges::view_interface:
    std::cout << "c2.front(): " << c2.front() << '\n';
//  auto e3 = c2.back(); // error: "bidirectional range" required
//  auto e4 = c2.data(); // error: "contiguous range" required
//  auto e5 = c2[0];     // error: "random access range" required
}

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

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

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

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

DR Применимо к Поведение как опубликовано Правильное поведение
LWG 3494 C++20 common_view никогда не был borrowed_range является borrowed_range , если его базовое представление является

См. также

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

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

Spec-Zone.ru

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