std::ranges::subrange
С сайта ru.cppreference.net
| Определён в заголовке <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 объединяет итератор и страж в единое представление. Он моделирует 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>>;
Элементы данных
| Член | Описание |
constexpr bool 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
(public member function) |
|
преобразует
subrange
в тип
pair-like
(public member function) |
|
Наблюдатели |
|
|
получает итератор
(public member function) |
|
|
получает страж
(public member function) |
|
проверяет, является ли
subrange
пустым
(public member function) |
|
получает размер
subrange
(public member function) |
|
Операции с итераторами |
|
|
перемещает итератор на заданное расстояние
(public member function) |
|
получает копию
subrange
с итератором, уменьшенным на заданное расстояние
(public member function) |
|
получает копию
subrange
с итератором, перемещённым на заданное расстояние
(public member function) |
|
Унаследовано от ranges::view_interface | |
(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>)
| |
возвращает элемент с индексом nth в производном представлении, только если оно удовлетворяет random_access_range (открытая функция-член std::ranges::view_interface<D>)
| |
Руководства по выводу
Функции, не являющиеся членами класса
|
(C++20)
|
получает итератор или страж из
std::ranges::subrange
(шаблон функции) |
Вспомогательные типы
|
(C++20)
|
указывает, моделирует ли
std::ranges::subrange
концепцию
std::ranges::sized_range
(перечисление) |
|
получает размер
std::ranges::subrange
(специализация шаблона класса) |
|
|
получает тип итератора или сторожа
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++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3470 | C++20 |
convertible-to-non-slicing
might reject qualification conversions
|
always accepts them |
Смотрите также
|
(C++20)
|
вспомогательный шаблон класса для определения
view
, использующий
шаблонный паттерн "Curiously Recurring Template Pattern"
(шаблон класса) |
Внешние ссылки
Чтение/запись всех значений
std::multimap
с заданным ключом в C++20
— Stack Overflow
|