<ranges>
Функции
Заголовок <ranges>
C++20 включает следующие вспомогательные функции, отличные от членов.
Функции, не являющиеся членами | Description |
---|---|
begin C++20 |
Получите итератор к первому элементу в диапазоне. |
cbegin C++20 |
Получите итератор к первому const элементу в диапазоне. |
cend C++20 |
Получите sentinel в конце const диапазона -qualified. |
cdata C++20 |
const Получите указатель на первый элемент в непрерывном диапазоне. |
crbegin C++20 |
Получите обратный const итератор до начала диапазона. |
crend C++20 |
Получите sentinel в конце возвращаемого crbegin() значения. |
data C++20 |
Получите указатель на первый элемент в непрерывном диапазоне. |
empty C++20 |
Проверьте, является ли диапазон пустым. |
end C++20 |
Получите sentinel в конце диапазона. |
rbegin C++20 |
Получите обратный итератор до начала диапазона. |
rend C++20 |
Получите обратный итератор в sentinel в конце диапазона. |
size C++20 |
Получите размер диапазона в виде значения без знака. |
ssize C++20 |
Получите размер диапазона в виде подписанного значения. |
Многие из этих функций реализуются как объекты точек настройки. Объект точки настройки — это объект функции, который можно перегружать для определяемых пользователем типов, а также принудительно применять ограничения, для которых типы могут передаваться объекту функции. Чистый эффект заключается в том, что компилятор определяет, есть ли допустимая настраиваемая функция для вызова переданного типа, или если реализация по умолчанию должна использоваться, или если вызов не сформирован.
Многие из этих функций имеют соответствующие функции в std
пространстве имен. Но при работе с диапазонами используйте эти вспомогательные функции. Эти функции используют основные понятия C++20, которые обеспечивают более высокую погрешность времени компиляции. Поскольку они реализованы в качестве точек настройки, проблемы, связанные с поиском зависимых аргументов (ADL) и константной правильностью, избегаются.
begin
Получите итератор к первому элементу в диапазоне.
template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);
Параметры
T
Тип диапазона.
rg
Диапазон.
Возвращаемое значение
Итератор к первому элементу в диапазоне:
Если диапазон является массивом, возвращает эквивалент 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
Итератор к первому элементу в диапазоне:
Если диапазон является массивом, возвращает эквивалент 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:
Замечания
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
итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца диапазона:
Если диапазон является массивом, возвращает эквивалент 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 следует последнему элементу в обратном представлении диапазона:
Замечания
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, следующий за последним элементом в диапазоне:
Замечания
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
Диапазон.
Возвращаемое значение
Обратный итератор к первому элементу в диапазоне. Этот итератор возвращает элементы диапазона в обратном порядке, начиная с конца обратного диапазона:
Если диапазон является массивом, возвращает эквивалент 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 следует последнему элементу в обратном представлении диапазона:
Замечания
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
}