Namespaces
Variants

std::ranges:: subrange

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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*/ =

/* см. описание */ ;
(2) ( только для демонстрации* )
template < class From, class To >
concept /*convertible-to-non-slicing*/ = /* см. описание */ ;
(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>>;

Содержание

Члены данных

Член Определение
constexpr bool StoreSize [static] K == ranges :: subrange_kind :: sized &&
! std:: sized_sentinel_for < S, I >

( только для демонстрации* (exposition-only static member constant) )
I begin_ итератор на начало поддиапазона
( только для демонстрации* (exposition-only member object) )
S end_ страж (sentinel), обозначающий конец поддиапазона
( только для демонстрации* (exposition-only member object) )
make-unsigned-like-t  < std:: iter_difference_t < I >> size_
(присутствует только если StoreSize равно true )
размер поддиапазона
( только для демонстрации* (exposition-only member object) )

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

создаёт новый 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)
Унаследовано от std::ranges::view_interface
(C++23)
возвращает константный итератор на начало диапазона
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает страж для константного итератора диапазона
(public member function of std::ranges::view_interface<D> )
возвращает, является ли производное представление непустым, при условии, что к нему применима ranges::empty
(public member function of std::ranges::view_interface<D> )
получает адрес данных производного представления, при условии, что его тип итератора удовлетворяет contiguous_iterator
(public member function of std::ranges::view_interface<D> )
возвращает первый элемент в производном представлении, при условии, что оно удовлетворяет forward_range
(public member function of std::ranges::view_interface<D> )
возвращает последний элемент в производном представлении, при условии, что оно удовлетворяет bidirectional_range и common_range
(public member function of std::ranges::view_interface<D> )
возвращает n элемент в производном представлении, при условии, что оно удовлетворяет random_access_range
(public member function of std::ranges::view_interface<D> )

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

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

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

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

указывает, моделирует ли 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

Смотрите также

вспомогательный шаблон класса для определения view , использующий шаблонный паттерн "Curiously Recurring Template Pattern"
(шаблон класса)

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

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