Поделиться через


<ranges>Функции

Заголовок <ranges>C++20 включает следующие вспомогательные функции, отличные от членов.

Функции, не являющиеся членами Description
beginC++20 Получите итератор к первому элементу в диапазоне.
cbeginC++20 Получите итератор к первому const элементу в диапазоне.
cendC++20 Получите sentinel в конце constдиапазона -qualified.
cdataC++20 const Получите указатель на первый элемент в непрерывном диапазоне.
crbeginC++20 Получите обратный const итератор до начала диапазона.
crendC++20 Получите sentinel в конце возвращаемого crbegin() значения.
dataC++20 Получите указатель на первый элемент в непрерывном диапазоне.
emptyC++20 Проверьте, является ли диапазон пустым.
endC++20 Получите sentinel в конце диапазона.
rbeginC++20 Получите обратный итератор до начала диапазона.
rendC++20 Получите обратный итератор в sentinel в конце диапазона.
sizeC++20 Получите размер диапазона в виде значения без знака.
ssizeC++20 Получите размер диапазона в виде подписанного значения.

Многие из этих функций реализуются как объекты точек настройки. Объект точки настройки — это объект функции, который можно перегружать для определяемых пользователем типов, а также принудительно применять ограничения, для которых типы могут передаваться объекту функции. Чистый эффект заключается в том, что компилятор определяет, есть ли допустимая настраиваемая функция для вызова переданного типа, или если реализация по умолчанию должна использоваться, или если вызов не сформирован.

Многие из этих функций имеют соответствующие функции в std пространстве имен. Но при работе с диапазонами используйте эти вспомогательные функции. Эти функции используют основные понятия C++20, которые обеспечивают более высокую погрешность времени компиляции. Поскольку они реализованы в качестве точек настройки, проблемы, связанные с поиском зависимых аргументов (ADL) и константной правильностью, избегаются.

begin

Получите итератор к первому элементу в диапазоне.

template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Итератор к первому элементу в диапазоне:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

Если диапазон является массивом, возвращает эквивалент rg + 0. Если auto(rg.begin()) возвращает итератор, возвращает эквивалент auto(rg.begin()). Если это выражение неправильно сформировано, используется, auto(begin(rg)) если это выражение дает итератор.

Замечания

ranges::begin() работает на всех диапазонах, в то время как std::begin() не может.

Пример: begin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::begin(v);
    std::cout << *vi << ' ' << *++vi; // outputs 10 20
}

cbegin

Получите итератор к первому const элементу в диапазоне. Итератор может получить доступ к элементам в диапазоне, но не может их изменить.

template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

const Итератор к первому элементу в диапазоне:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как cbegin(). Последний элемент содержит 30 и помечен как последний элемент. Воображаемое поле после последнего элемента указывает sentinel и помечено cend().

Если диапазон является массивом, возвращает эквивалент rg + 0. Если auto(rg.cbegin()) возвращает итератор, возвращает эквивалент auto(rg.cbegin()). Если это выражение неправильно сформировано, используется, auto(cbegin(rg)) если это выражение дает итератор.

Замечания

ranges::cbegin() работает на всех диапазонах, в то время как std::cbegin() не может.

Пример: cbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::cbegin(v);
    std::cout << *vi; // outputs 10
    // *vi = 100; // error because the iterator is const
}

cdata

const Получите указатель на первый элемент в непрерывном диапазоне.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Указатель const , основанный на типе диапазона, к первым данным элемента в непрерывном диапазоне. Например, если диапазон является вектором целых чисел, тип возвращаемого значения — это .const int *

Пример: cdata

#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto c_charPtr = std::ranges::cdata(src); // ptr is a const char *
    auto c_intPtr = std::ranges::cdata(v); // ptr2 is a const int *
    std::cout << c_charPtr << ", " << *c_intPtr << '\n'; // outputs a string, 10

    // *c_intPtr = 100; // error - cannot assign to a const pointer
    // *charPtr = 'A'; // error - cannot assign to a const pointer
}

cend

Получите sentinel в конце constдиапазона -qualified. Итератор может получить доступ к элементам в диапазоне, но не может их изменить.

template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Sentinel, следующий за последним элементом в диапазоне const-qualified:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен cbegin(). Последний элемент содержит 30 и помечен как последний элемент. Воображаемое поле после последнего элемента указывает sentinel и помечено cend().

Замечания

ranges::cend() работает на всех диапазонах, в то время как std::cend() не может.

Пример: cend

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::cend(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
    // *i = 300 // error because the iterator is const
}

crbegin

Получите обратный const итератор к первому элементу в обратном диапазоне. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Обратный const итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца диапазона:

Изображение вектора, содержащего элементы 10, 20 и 30. Перед самым левым элементом (левым элементом содержится число 10), представляющее sentinel, есть мнимый прямоугольник. Это помеченный кренд(). Первый элемент в векторе содержит число 10 и помечен как последний элемент. Самый правый элемент в векторе содержит 30 и помечен crbegin().

Если диапазон является массивом, возвращает эквивалент reverse_iterator{rg + n} того, где n находится число элементов в массиве. Если auto(rg.crbegin()) возвращает итератор, возвращает эквивалент auto(rg.crbegin()). Если это выражение неправильно сформировано, используется, auto(crbegin(rg)) если это выражение дает итератор.

Замечания

ranges::crbegin() работает на всех двунаправленных диапазонах, в то время как std::crbegin() не может.

Пример: crbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
    // vi[1] = 100; // error because the iterator is const
}

crend

Получите sentinel в конце возвращаемого crbegin() значения. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Sentinel в конце возвращаемого cbegin() значения. Sentinel следует последнему элементу в обратном представлении диапазона:

Изображение вектора, содержащего элементы 10, 20 и 30. Перед самым левым элементом (левым элементом содержится число 10), представляющее sentinel, есть мнимый прямоугольник. Это помеченный кренд(). Первый элемент в векторе содержит число 10 и помечен как последний элемент. Самый правый элемент в векторе содержит 30 и помечен crbegin().

Замечания

ranges::crend() работает на всех двунаправленных диапазонах, в то время как std::crend() не может.

Пример crend

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    // vi[0] = 300; // error because the iterator is const    
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

data

Получите указатель на первый элемент в непрерывном диапазоне.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Указатель, основанный на типе диапазона, к первому элементу в непрерывном диапазоне. Например, если диапазон является вектором целых чисел, тип возвращаемого значения — это .int *

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto charPtr = std::ranges::data(src); // charPtr is a char *
    auto intPtr = std::ranges::data(v); // intPtr is an int *
    std::cout << charPtr << ", " << *intPtr << '\n'; // outputs a string, 10
    *intPtr = 100;
    *charPtr = 'A';
    std::cout << charPtr << ", " << *intPtr; // outputs A string, 100
}

empty

Проверьте, является ли диапазон пустым.

template<class T>
constexpr bool empty(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Возвращает значение true , если диапазон не содержит элементов; в противном случае false.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
        std::vector v{10,20,30};
    std::vector<int> v2;

    std::cout << std::boolalpha << std::ranges::empty(v); // outputs false
    std::cout << std::boolalpha << ", " << std::ranges::empty(v2); // outputs true
}

end

Получите sentinel в конце диапазона.

template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Sentinel, следующий за последним элементом в диапазоне:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

Замечания

ranges::end() работает на всех диапазонах, в то время как std::end() не может.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::end(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
}

rbegin

Получите обратный итератор к первому элементу в обратном диапазоне. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Обратный итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца обратного диапазона:

Изображение вектора, содержащего элементы 10, 20 и 30. Перед самым левым элементом (левым элементом содержится число 10), представляющее sentinel, есть мнимый прямоугольник. Он помечен как rend(). Первый элемент в векторе содержит число 10 и помечен как последний элемент. Самый правый элемент в векторе содержит 30 и помечен rbegin().

Если диапазон является массивом, возвращает эквивалент reverse_iterator{rg + n} того, где n находится число элементов в массиве. Если auto(rg.rbegin()) возвращает итератор, возвращает эквивалент auto(rg.rbegin()). Если это выражение неправильно сформировано, используется, auto(rbegin(rg)) если это выражение дает итератор.

Замечания

ranges::rbegin() работает на всех двунаправленных диапазонах, в то время как std::rbegin() не может.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
}

rend

Получите обратный итератор в sentinel в конце обратного представления диапазона. Обратный итератор возвращает элементы диапазона в обратном порядке. Сам диапазон не является обратным; доступ к нему.

template<class T>
constexpr 
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Обратный итератор в sentinel в конце диапазона. Sentinel следует последнему элементу в обратном представлении диапазона:

Изображение вектора, содержащего элементы 10, 20 и 30. Перед самым левым элементом (левым элементом содержится число 10), представляющее sentinel, есть мнимый прямоугольник. Он помечен как rend(). Первый элемент в векторе содержит число 10 и помечен как последний элемент. Самый правый элемент в векторе содержит 30 и помечен rbegin().

Замечания

ranges::rend() работает на всех двунаправленных диапазонах, в то время как std::rend() не может.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

size

Получите количество элементов в диапазоне в виде значения без знака.

template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Число элементов в диапазоне в виде целого числа без знака.

Замечания

Эта функция выполняется в постоянное время.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::size(v); // s is a size_t
    std::cout << s; // outputs 3
}

ssize

Получите размер диапазона в виде подписанного значения.

template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);

Параметры

T
Тип диапазона.

rg
Диапазон.

Возвращаемое значение

Количество элементов в диапазоне в виде целочисленного значения со знаком.

Замечания

Эта функция выполняется в постоянное время.

Пример

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::ssize(v);
    std::cout << s; // outputs 3
}

См. также

<ranges>
Что такое объекты настройки