给定一个任意类型 T 的内置数组 x,有一些函数可以调用std::begin()
,std::end()
但为什么没有std::size()
? 没有那个似乎很奇怪。
我可以使用std::end(x)-std::begin(x)
,但仍然std::size(x)
会更好。
是的,我知道std::vector
andstd::array
类。这只是一个问题,为什么在 STL 中还没有像这样简单的东西。
只是让人们知道N4280 “非成员大小()等(修订版 2)”已被 C++17 工作草案接受。这包括std::size()
以及std::empty()
和std::data()
。
有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; };
STL 算法适用于迭代器,而不适用于任何容器,STL 容器的大小需要一个开始和结束,这是没有意义的。对于这样的我们已经有了std::distance
我想你的意思是类 C 数组。正如 Bjarne Stroustrup 所说,答案是因为“C 中的数组是一种非常愚蠢的数据类型,它甚至不知道它有多少元素。” 一旦数组衰减到指针,就无法知道“数组”中有多少元素。