Spec-Zone.ru › C++

std::ranges::subrange

Определён в заголовочном файле <ranges>
template<
    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
                                  ranges::subrange_kind::sized :
                                  ranges::subrange_kind::unsized >
    requires (K == ranges::subrange_kind::sized || !std::sized_sentinel_for<S, I>)
class subrange
    : public ranges::view_interface<subrange<I, S, K>>
(1) (начиная с C++20)
Вспомогательные концепты
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    /* see description */;
(2) (только для иллюстрации*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
(3) (только для иллюстрации*)
1) Шаблон класса subrange объединяет итератор и сентинел в один view. Он моделирует sized_range, если последний параметр шаблона равен subrange_kind​::​sized (что происходит, когда выполняется std::sized_sentinel_for<S, I> или когда размер явно передаётся в качестве аргумента конструктора).
2) Определяет, можно ли преобразовать From в To без преобразований квалификации. Эквивалентно:
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) Определяет, можно ли преобразовать From в To без преобразования производного класса в базовый:
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

Поля данных

Элемент Описание
constexprbool StoreSize [static] K == ranges::subrange_kind::sized &&    !std::sized_sentinel_for<S, I>
(статическая константа-член, только для иллюстрации*)
I begin_ итератор, указывающий на начало поддиапазона
(объект-член, только для иллюстрации*)
S end_ сентинел, обозначающий конец поддиапазона
(объект-член, только для иллюстрации*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(присутствует только если StoreSize равно true)
размер поддиапазона
(объект-член, только для иллюстрации*)

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

(конструктор)
создаёт новый subrange
(открытая функция-член)
operator PairLike
преобразует subrange в тип pair-like
(открытая функция-член)
Наблюдатели
begin
получает итератор
(открытая функция-член)
end
получает сентинел
(открытая функция-член)
empty
проверяет, пуст ли subrange
(открытая функция-член)
size
получает размер subrange
(открытая функция-член)
Операции с итераторами
advance
перемещает итератор на заданное расстояние
(открытая функция-член)
prev
получает копию subrange с итератором, уменьшенным на заданное расстояние
(открытая функция-член)
next
получает копию subrange с итератором, перемещённым вперёд на заданное расстояние
(открытая функция-член)
Унаследовано от std::ranges::view_interface
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает сентинел для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает значение, указывающее, что производное представление не пусто; предоставляется только если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
data
получает адрес данных производного представления; предоставляется только если тип его итератора удовлетворяет концепту contiguous_iterator
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления; предоставляется, если оно удовлетворяет концепту forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется только если оно удовлетворяет концептам bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает n-й элемент производного представления; предоставляется только если оно удовлетворяет концепту random_access_range
(открытая функция-член std::ranges::view_interface<D>)

Руководства по выведению типов

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

get(std::ranges::subrange)
(C++20)
получает итератор или сентинел из std::ranges::subrange
(шаблон функции)

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

ranges::subrange_kind
(C++20)
указывает, моделирует ли std::ranges::subrange концепт std::ranges::sized_range
(перечисление)
std::tuple_size<std::ranges::subrange>
(C++20)
получает размер std::ranges::subrange
(специализация шаблона класса)
std::tuple_element<std::ranges::subrange>
(C++20)
получает тип итератора или сентинела std::ranges::subrange
(специализация шаблона класса)

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

template< class I, class S, ranges::subrange_kind K >
constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true;
(начиная с C++20)

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

Пример

#include <map>
#include <print>
#include <ranges>
 
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
 
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
 
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

Вывод:

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

Отчёты об ошибках

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

Отчёт об ошибке Применяется к Опубликованное поведение Правильное поведение
LWG 3470 C++20 convertible-to-non-slicing мог отклонять преобразования квалификации всегда принимает их

См. также

ranges::view_interface
(C++20)
вспомогательный шаблон класса для определения view с использованием шаблонного паттерна с любопытно повторяющимся шаблоном
(шаблон класса)

Внешние ссылки

Чтение/запись всех значений std::multimap с заданным ключом в C++20 — SO

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

Spec-Zone.ru

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