当参数是一个数组时,C ++如何开始和结束?

时间:2015-11-09 02:38:24

标签: c++ arrays stl

C ++入门中的一个问题,当向量上的开始和结束工作我知道有vector :: size()可能会有所帮助,但是当我给出一个数组参数时它们是如何工作的。 就像:

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

end(arr)和begin(arr)如何正常工作?

2 个答案:

答案 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;
}