给定一个任意类型为T的内置数组x,我可以调用函数std::begin()
和std::end()
,但为什么不存在std::size()
?似乎奇怪没有那个。
我可以使用std::end(x)-std::begin(x)
,但仍然会std::size(x)
更好。
是的,我知道std::vector
和std::array
类。这只是为什么STL中还没有这么简单的问题。
答案 0 :(得分:23)
只是让人们知道N4280“非成员大小()及更多(修订版2)”已被C ++ 17工作草案接受的说明。其中包括std::size()
以及std::empty()
和std::data()
。
答案 1 :(得分:14)
有std::extent
,它将应用于数组的类型:
#include <type_traits>
int a[12];
assert(std::extent<decltype(a)>::value == 12);
或者,您可以使用std::distance(std::begin(a), std::end(a))
。
前者显然是一个不变的表达,但在实践中,后者也可以静态计算。
最后,始终存在本土解决方案:
template <typename T, std::size_t N>
constexpr std::size_t array_size(T const (&)[N])
{ return N; };
答案 2 :(得分:2)
STL算法适用于迭代器,而不是任何容器,STL容器的大小需要一个开始和结束,这是没有意义的。为此,我们已经有std::distance
答案 3 :(得分:0)
我想你的意思是类似C的数组。正如Bjarne Stroustrup所说,答案是因为“C中的数组是一种非常愚蠢的数据类型,甚至不知道它有多少元素。”一旦数组衰减到指针,就无法知道“数组”中有多少个元素。