Składnia
#include <iterator>
template < typename C >
constexpr auto cend( const C & c ) noexcept( )->decltype( std::end( c ) );
template < typename T, std::size_t N >
constexpr const T * cend( const T( & array )[ N ] ) noexcept;
template < typename T >
const T * cend( initializer_list < T > il ) noexcept;
template < typename T >
cend( const valarray < T >& v );
directory_iterator cend( directory_iterator iter ) noexcept;
recursive_directory_iterator cend( recursive_directory_iterator iter ) noexcept;
Powyższe
noexcept
jest
noexcept
, jeśli odpowiadające temu kontenerowi
std::end( c )
również jest
noexcept
:
noexcept( noexcept( std::end( c ) ) )
Parametry szablonu
Argumenty
Zwracana wartość
Dla kontenerów zwracane jest dokładnie to co zwraca
C::end()
ale jako
const
. Jeśli C jest standardowym kontenerem to zwracany jest stały iterator za ostatni element kontenera, typu
typename C::const_iterator
.
W przypadku tablic jest zwracany stały wskaźnik wskazujący na za ostatni element tablicy, czyli
const T *
.
Opis szczegółowy
Jest to szablon funkcji, która dla kontenerów zwraca stały iterator na koniec kontenera (za ostatni jego element), czyli to co metoda
C::end()
dla stałego obiektu.
Funkcja przyjmując tablicę statyczną zwraca stały wskaźnik na koniec tablicy, czyli za ostatni jej element.
Dodatkowe informacje
Funkcja ta nie działa dla tablic dynamicznych, gdyż nie jest możliwe wygenerowanie w trakcie kompilacji specjalizacji dla funkcji gdy rozmiar tablicy, podanej jako argument, nie jest znany podczas kompilacji.
Aby funkcja działała dla naszego typu musimy zdefiniować w nim metodę stałą:
...end() const;
.
Rzucane wyjątki
Jesli
std::end( c )
nie rzuca wyjątków, to również
std::cend( c )
ich nie rzuca (
noexcept
).
Wymagania
Kompilator posiadający implementację szablonu funkcji
std::cend()
, lub zgodny z C++14.
Implementacja
template < typename C >
constexpr const auto cend( const C & c ) noexcept( noexcept( std::end( c ) ) )->decltype( std::end( c ) )
{
return c.end();
}
template < typename T, std::size_t N >
constexpr const T * cend( const T( & array )[ N ] ) noexcept
{
return array + N;
}
Przykład
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct MyContainer
{
int arr[ 10 ];
constexpr static unsigned size = sizeof( arr ) / sizeof( arr[ 0 ] );
auto cbegin() const
{
return arr;
}
auto cend() const
{
return arr + size;
}
auto begin() const
{
return arr;
}
auto end() const
{
return arr + size;
}
auto begin()
{
return arr;
}
auto end()
{
return arr + size;
}
};
int main()
{
vector < int > v = { 1, 3, 5, 7, 9 };
cout << "last element of vector: " << *( cend( v ) - 1 ) << endl;
double arr[] = { 3.14, 2.78 };
cout << "\nsecond element of array: " << *( cend( arr ) - 1 ) << endl;
const MyContainer c = { { 5, 7, 9, 2, 1, 4, 3 } };
cout << "elements in my container: " <<( cend( c ) - cbegin( c ) ) << endl;
const auto value2Find = 4;
if( find( cbegin( c ), cend( c ), value2Find ) != cend( c ) )
cout << value2Find << " found in the container" << endl;
else
cout << value2Find << " not found in the container" << endl;
}
Standardowe wyjście programu:
last element of vector: 9
second element of array: 2.78
elements in my container: 10
4 found in the container
Zagadnienia powiązane
cbegin | Jest to funkcja zwracająca stały iterator na pierwszy element kontenera lub stały wskaźnik na początek tablicy. (szablon funkcji) |
---|
Linki zewnętrzne