2015-11-09 14 views
5

Problem w podkładzie C++, kiedy zaczynają się i kończą pracę na wektorze Wiem, że vector :: size() może pomóc, ale jak one działają, gdy podaję argument tablicowy. prostu lubię:W jaki sposób rozpoczyna się i kończy działanie C++, gdy argument jest tablicą?

int arr[] = {1, 2, 3}; 
size = end(arr) - begin(arr); 

jak zrobić koniec (ARR) i rozpocząć (ARR) działa poprawnie?

+4

Czy chodziło Ci o 'int arr []'? – fghj

+3

[W jaki sposób std :: end zna koniec tablicy?] (Http://stackoverflow.com/q/33496322/1708801) wydaje się istotne, jeśli nie jest duplikatem. –

+0

Przypuszczam, że ściśle mówiąc, ponieważ to pytanie dotyczy zarówno początku, jak i końca, nie jest to dokładny duplikat. Również pytanie @ user1034749 powinno zostać wyjaśnione. –

Odpowiedz

4

więc zobaczyć, jak std::end prace możemy spojrzeć na How does std::end know the end of an array? i zobacz, że podpis na std::end jest:

template< class T, std::size_t N > 
T* end(T (&array)[N]); 

i używa parametru szablonu non-type do dedukcji rozmiaru tablicy i jest tylko kwestią arytmetyki wskaźnika, aby uzyskać koniec:

return array + N ; 

Dla std::begin podpis jest identyczny, z wyjątkiem nazwy:

template< class T, std::size_t N > 
T* begin(T (&array)[N]); 

i obliczania początek tablicy jest po prostu kwestia array to pointer decay co daje nam wskaźnik do pierwszego elementu szyk.

W C++ 14 oba stają się constexpr.

2

Ja po prostu wkleić fragment kodu z here

template <class _Tp, size_t _Np> 
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 
_Tp* 
begin(_Tp (&__array)[_Np]) 
{ 
    return __array; 
} 

template <class _Tp, size_t _Np> 
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 
_Tp* 
end(_Tp (&__array)[_Np]) 
{ 
    return __array + _Np; 
} 
+0

To jest okropna odpowiedź, nie ma żadnego wyjaśnienia. –

+0

@ShafikYaghmour, czy kod nie jest wystarczająco jasny? –

+0

dziękuję bardzo, chociaż nadal nie wiem "inline" w tym kawałku kodu ... – alexxx

Powiązane problemy