Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: baziorek
Język C++

cend

[szablon funkcji] Szablon funkcji zwracająca stały iterator na koniec kontenera lub stały wskaźnik na koniec tablicy.

Składnia

C/C++
#include <iterator>

template < typename C >
constexpr auto cend( const C & c ) noexcept( /*szczegoły poniżej*/ )->decltype( std::end( c ) );

// w oparciu o powyzsze zostanie wygenerowana rownież wersja dla tablic (std::end ma przeciążoną wersje dla tablic):
template < typename T, std::size_t N >
constexpr const T * cend( const T( & array )[ N ] ) noexcept;

// przeciążenia:
template < typename T >
const T * cend( initializer_list < T > il ) noexcept;
template < typename T >
/*nieznany*/ cend( const valarray < T >& v );

// wraz z C++17 pojawiły się następujące przeciążenia:
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

ParametrOpis
Ckontener, dla którego działa metoda
std::end()
Ttyp tablicy statycznej, przekazanej jako argument
Nilość elementów tablicy statycznej

Argumenty

ArgumentOpis
cstała referencja do kontenera zawierającego metodę
std::end()
arraystała referencja do statycznej tablicy

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

C/C++
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

C/C++
#include <iostream>
#include <algorithm> // find()
#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

cbeginJest 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