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 (общедоступная функция-член) |
|
(C++20) | преобразует subrange в тип pair-like (общедоступная функция-член) |
Наблюдатели |
|
|
(C++20) | получает итератор (общедоступная функция-член) |
|
(C++20) | получает конечную точку (общедоступная функция-член) |
|
(C++20) | проверяет, является ли subrange пустым (общедоступная функция-член) |
|
(C++20) | получает размер subrange (общедоступная функция-член) |
Операции с итераторами |
|
|
(C++20) | продвигает итератор на заданное расстояние (общедоступная функция-член) |
|
(C++20) | получает копию subrange с уменьшенным на заданное расстояние итератором (общедоступная функция-член) |
|
(C++20) | получает копию subrange с продвинутым на заданное расстояние итератором (общедоступная функция-член) |
Унаследовано от |
|
|
(C++23) | возвращает постоянный итератор в начало диапазона. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает конечную точку для постоянного итератора диапазона. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает, пустой ли производный вид. Доступно, если ranges::empty применима к нему. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | получает адрес данных производного вида. Доступно, если тип его итератора удовлетворяет contiguous_iterator. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент в производном виде. Доступно, если оно удовлетворяет forward_range. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент в производном виде. Доступно, если оно удовлетворяет bidirectional_range и common_range. (общедоступная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-й элемент в производном виде. Доступно, если оно удовлетворяет random_access_range. (общедоступная функция-член std::ranges::view_interface<D>) |
Руководства по выводу
Функции без параметров
|
(C++20) | получает итератор или конечную точку из std::ranges::subrange (шаблон функции) |
Вспомогательные типы
|
(C++20) | указывает, моделирует ли std::ranges::subrange std::ranges::sized_range (перечисление) |
|
(C++20) | получает количество компонентов 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,'-'} }См. также
|
(C++20) | шаблон класса-помощник для определения view с использованием шаблона своеобразно повторяющегося шаблона (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/subrange