C ++入门中的一个问题,当向量上的开始和结束工作我知道有vector :: size()可能会有所帮助,但是当我给出一个数组参数时它们是如何工作的。 就像:
int arr[] = {1, 2, 3};
size = end(arr) - begin(arr);
end(arr)和begin(arr)如何正常工作?
答案 0 :(得分:4)
为了了解std::end的工作原理,我们可以查看How does std::end know the end of an array?并查看std::end
的签名是:
template< class T, std::size_t N >
T* end( T (&array)[N] );
它正在使用模板非类型参数来推导数组的大小,它只是指针运算的一个问题来获得结束:
return array + N ;
对于std::begin
,签名是相同的,但名称除外:
template< class T, std::size_t N >
T* begin( T (&array)[N] );
并计算数组的开头只是array to pointer decay的问题,它为我们提供了指向数组第一个元素的指针。
在C ++ 14中,这两者都变成了constexpr。
答案 1 :(得分:2)
我只是粘贴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;
}