Spec-Zone.ru › C++

std::end, std::cend

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

Возвращает итератор к концу (т.е. элементу после последнего элемента) заданного диапазона.

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

range-begin-end.svg

Параметры

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

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

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

Исключения

4)
noexcept спецификация:
noexcept(noexcept(std::end(c)))

Перегрузки

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

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

Аналогично использованию swap (описано в Swappable), типичное использование функции end в общем контексте эквивалентно using std::end; end(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);
 
    for (; it != end_it; ++it)
        f(*it);
}

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

(с C++20)

Замечания

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

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

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

Пример

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v = {3, 1, 4};
    if (std::find(std::begin(v), std::end(v), 5) != std::end(v))
        std::cout << "Found a 5 in vector v!\n";
 
    int w[] = {5, 10, 15};
    if (std::find(std::begin(w), std::end(w), 5) != std::end(w))
        std::cout << "Found a 5 in array w!\n";
}

Вывод:

Found a 5 in array w!

См. также

begincbegin
(C++11)(C++14)
возвращает итератор к началу контейнера или массива
(шаблон функции)
ranges::end
(C++20)
возвращает стоп-символ, указывающий на конец диапазона
(объект кастомизации)
ranges::cend
(C++20)
возвращает стоп-символ, указывающий на конец только для чтения диапазона
(объект кастомизации)

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

Spec-Zone.ru

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