Spec-Zone.ru › C++

std::ranges::range

Определён в заголовке <ranges>
template< class T >
concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);
};
(начиная с C++20)

Концепт range задаёт требования к типу, который позволяет перебирать его элементы, предоставляя итератор и сентинел, обозначающие элементы диапазона.

Семантические требования

Для заданного выражения E, такого что decltype((E)) является T, T удовлетворяет range только если

  • [ranges::begin(E), ranges::end(E)) обозначает диапазон, и
  • обе операции ranges::begin(E) и ranges::end(E) выполняются за амортизированное константное время и не изменяют значение E способом, наблюдаемым выражениями, сохраняющими равенство, и
  • если тип ranges::begin(E) удовлетворяет концепту forward_iterator, ranges::begin(E) сохраняет равенство (иными словами, итераторы прямого прохода поддерживают алгоритмы с несколькими проходами).

Примечания

Типичному классу range достаточно предоставить две функции:

  1. Функцию-член begin(), тип возвращаемого значения которой удовлетворяет концепту input_or_output_iterator.
  2. Функцию-член end(), тип возвращаемого значения которой удовлетворяет концепту sentinel_for<It>, где It — это тип возвращаемого значения begin().

В качестве альтернативы они могут быть нестатическими функциями-членами; такие функции можно найти с помощью поиска, зависящего от аргументов.

Пример

#include <ranges>

// A minimum range
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);

// Not a range: no begin/end
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);

// Not a range: begin does not return an input_or_output_iterator
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);

int main() {}

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 3915 C++20 ranges::begin(t) и ranges::end(t)
не требовали неявных вариантов выражений
удалено
избыточное описание

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

Spec-Zone.ru

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