Spec-Zone.ru › C++

std::begin, std::cbegin

Определено в заголовке <array>
Определено в заголовке <deque>
Определено в заголовке <forward_list>
Определено в заголовке <iterator>
Определено в заголовке <list>
Определено в заголовке <map>
Определено в заголовке <regex>
Определено в заголовке <set>
Определено в заголовке <span> (с C++20)
Определено в заголовке <string>
Определено в заголовке <string_view> (с C++17)
Определено в заголовке <unordered_map>
Определено в заголовке <unordered_set>
Определено в заголовке <vector>
(1)
template< class C > 
auto begin( C& c ) -> decltype(c.begin());
(с C++11)
(до C++17)
template< class C > 
constexpr auto begin( C& c ) -> decltype(c.begin());
(с C++17)
(1)
template< class C > 
auto begin( const C& c ) -> decltype(c.begin());
(с C++11)
(до C++17)
template< class C > 
constexpr auto begin( const C& c ) -> decltype(c.begin());
(с C++17)
(2)
template< class T, std::size_t N > 
T* begin( T (&array)[N] );
(с C++11)
(до C++14)
template< class T, std::size_t N > 
constexpr T* begin( T (&array)[N] ) noexcept;
(с C++14)
template< class C > 
constexpr auto cbegin( const C& c ) noexcept(/* see below */)
    -> decltype(std::begin(c));
(3) (с C++14)

Возвращает итератор к началу заданного диапазона.

1) Возвращает точно c.begin(), что обычно является итератором к началу последовательности, представленной c. Если C — стандартный контейнер, это возвращает C::iterator когда c не имеет квалификатора const, и C::const_iterator в противном случае.
2) Возвращает указатель к началу array.
3) Возвращает точно std::begin(c), где c всегда рассматривается как имеющий квалификатор const. Если C — стандартный контейнер, это всегда возвращает C::const_iterator.

range-begin-end.svg

Параметры

c - контейнер или представление с членом-функцией begin
array - массив произвольного типа

Значение результата

Итератор к началу диапазона.

Исключения

3)
noexcept спецификация:
noexcept(noexcept(std::begin(c)))

Перегрузки

Могут быть предоставлены пользовательские перегрузки begin для классов и перечислений, которые не раскрывают подходящую функцию-член begin(), но могут быть итерированы. Следующие перегрузки уже предоставляются стандартной библиотекой:

std::begin(std::initializer_list)
(C++11)
перегрузки std::begin
(шаблон функции)
std::begin(std::valarray)
(C++11)
перегрузки std::begin
(шаблон функции)
begin(std::filesystem::directory_iterator)end(std::filesystem::directory_iterator)
(C++17)
поддержка циклов for диапазона
(функция)
begin(std::filesystem::recursive_directory_iterator)end(std::filesystem::recursive_directory_iterator)
поддержка циклов for диапазона
(функция)

Аналогично использованию swap (описано в Swappable), типичное использование функции begin в общем контексте эквивалентно using std::begin; begin(arg);, что позволяет как перегрузкам, выбранным по ADL для пользовательских типов, так и шаблонам функций стандартной библиотеки появиться в одном наборе перегрузок.

template<typename Container, typename Function>
void for_each(Container&& cont, Function f)
{
    using std::begin;
    auto it = begin(cont);
    using std::end;
    auto end_it = end(cont);
    while (it != end_it)
    {
        f(*it);
        ++it;
    }
}

Перегрузки begin, найденные с помощью поиска зависимого от аргументов, могут быть использованы для настройки поведения std::ranges::begin, std::ranges::cbegin, и других объектов-указателей кастомизации, зависящих от std::ranges::begin.

(с C++20)

Примечания

(1,3) точно отражают поведение C::begin(). Их эффекты могут быть неожиданными, если функция-член не имеет разумной реализации.

std::cbegin вводится для унификации доступа к диапазонам через члены и без них. См. также LWG issue 2128.

Если C — представление с поверхностным const, std::cbegin может вернуть изменяемый итератор. Такое поведение является неожиданным для некоторых пользователей. См. также P2276 и P2278.

Пример

#include <iostream>
#include <iterator>
#include <vector>
 
int main() 
{
    std::vector<int> v = {3, 1, 4};
    auto vi = std::begin(v);
    std::cout << std::showpos << *vi << '\n'; 
 
    int a[] = {-5, 10, 15};
    auto ai = std::begin(a);
    std::cout << *ai << '\n';
}

Вывод:

+3
-5

См. также

endcend
(C++11)(C++14)
возвращает итератор к концу контейнера или массива
(шаблон функции)
ranges::begin
(C++20)
возвращает итератор к началу диапазона
(объект точки кастомизации)
ranges::cbegin
(C++20)
возвращает итератор к началу диапазона только для чтения
(объект точки кастомизации)

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

Spec-Zone.ru

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