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>>
(с C++20)

Шаблон класса subrange объединяет итератор и конечную точку в один view.

Кроме того, поддиапазон является sized_range, когда последний параметр шаблона равен subrange_kind​::​sized (что происходит, когда выполняется std::sized_sentinel_for<S, I> или когда размер явно передаётся в качестве аргумента конструктора). Регистр размера требуется хранить только в том случае, если std::sized_sentinel_for<S, I> является false и K равно subrange_kind::sized.

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

(конструктор)
(C++20)
создаёт новый subrange
(общедоступная функция-член)
operator PairLike
(C++20)
преобразует subrange в тип pair-like
(общедоступная функция-член)
Наблюдатели
begin
(C++20)
получает итератор
(общедоступная функция-член)
end
(C++20)
получает конечную точку
(общедоступная функция-член)
empty
(C++20)
проверяет, является ли subrange пустым
(общедоступная функция-член)
size
(C++20)
получает размер subrange
(общедоступная функция-член)
Операции с итераторами
advance
(C++20)
продвигает итератор на заданное расстояние
(общедоступная функция-член)
prev
(C++20)
получает копию subrange с уменьшенным на заданное расстояние итератором
(общедоступная функция-член)
next
(C++20)
получает копию subrange с продвинутым на заданное расстояние итератором
(общедоступная функция-член)
Унаследовано от std::ranges::view_interface
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>)

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

Функции без параметров

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 >
inline constexpr bool enable_borrowed_range<ranges::subrange<I, S, K>> = true;

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

Пример

#include <iostream>
#include <map>
#include <ranges>
#include <string_view>
 
template<class V>
void mutate(V& v)
{
    v += 'A' - 'a';
}
 
template<class K, class V>
void mutate_map_values(std::multimap<K, V>& m, K k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        mutate(v);
}
 
int main()
{
    auto print = [](std::string_view rem, auto const& mm)
    {
        std::cout << rem << "{ ";
        for (const auto& [k, v] : mm)
            std::cout << '{' << k << ",'" << v << "'} ";
        std::cout << "}\n";
    };
 
    std::multimap<int, char> mm{{4,'a'}, {3,'-'}, {4,'b'}, {5,'-'}, {4,'c'}};
    print("Before: ", mm);
    mutate_map_values(mm, 4);
    print("After:  ", mm);
}

Вывод:

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

См. также

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

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

Spec-Zone.ru

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