Spec-Zone.ru › C++

std::end, std::cend

Определён в заголовочном файле <array>
Определён в заголовочном файле <deque>
Определён в заголовочном файле <flat_map> (начиная с C++23)
Определён в заголовочном файле <flat_set> (начиная с C++23)
Определён в заголовочном файле <forward_list>
Определён в заголовочном файле <hive> (начиная с C++26)
Определён в заголовочном файле <inplace_vector> (начиная с C++26)
Определён в заголовочном файле <iterator>
Определён в заголовочном файле <list>
Определён в заголовочном файле <map>
Определён в заголовочном файле <optional> (начиная с C++26)
Определён в заголовочном файле <regex>
Определён в заголовочном файле <set>
Определён в заголовочном файле <span> (начиная с C++20)
Определён в заголовочном файле <stacktrace> (начиная с C++23)
Определён в заголовочном файле <string>
Определён в заголовочном файле <string_view> (начиная с C++17)
Определён в заголовочном файле <unordered_map>
Определён в заголовочном файле <unordered_set>
Определён в заголовочном файле <valarray>
Определён в заголовочном файле <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)
template< class T, std::size_t N >
T* end( T (&array)[N] );
(3) (начиная с C++11)
(noexcept начиная с C++14)
(constexpr начиная с 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.
1) Если C — стандартный контейнер, возвращает объект C::iterator.
2) Если C — стандартный контейнер, возвращает объект C::const_iterator.
3) Возвращает указатель на конец array.
4) Возвращает std::end(c), при этом c всегда рассматривается как константный.
Если C — стандартный контейнер, возвращает объект C::const_iterator.

Параметры

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

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

1,2) c.end()
3) array + N
4) c.end()

Исключения

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

Перегрузки

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

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)
(C++17)
поддержка цикла 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)

Примечания

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

std::cend введена для унификации доступа к диапазонам через функции-члены и функции, не являющиеся членами класса. См. также проблему LWG 2128.

Если C — представление с поверхностной константностью, 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/cpp/iterator/end

Spec-Zone.ru

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