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 (открытая функция-член) |
|
преобразует subrange в тип pair-like (открытая функция-член) |
|
Наблюдатели |
|
| получает итератор (открытая функция-член) |
|
| получает сентинел (открытая функция-член) |
|
проверяет, пуст ли subrange (открытая функция-член) |
|
получает размер subrange (открытая функция-член) |
|
Операции с итераторами |
|
| перемещает итератор на заданное расстояние (открытая функция-член) |
|
получает копию subrange с итератором, уменьшенным на заданное расстояние (открытая функция-член) |
|
получает копию subrange с итератором, перемещённым вперёд на заданное расстояние (открытая функция-член) |
|
Унаследовано от |
|
|
(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>) |
|
возвращает 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 > 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 мог отклонять преобразования квалификации | всегда принимает их |
См. также
|
(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