14

给定一个任意类型 T 的内置数组 x,有一些函数可以调用std::begin()std::end()但为什么没有std::size()? 没有那个似乎很奇怪。

我可以使用std::end(x)-std::begin(x),但仍然std::size(x)会更好。

是的,我知道std::vectorandstd::array类。这只是一个问题,为什么在 STL 中还没有像这样简单的东西。

4

4 回答 4

28

只是让人们知道N4280 “非成员大小()等(修订版 2)”已被 C++17 工作草案接受。这包括std::size()以及std::empty()std::data()

于 2014-11-15T15:59:55.647 回答
16

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; };
于 2013-10-08T20:56:20.387 回答
2

STL 算法适用于迭代器,而不适用于任何容器,STL 容器的大小需要一个开始和结束,这是没有意义的。对于这样的我们已经有了std::distance

于 2013-10-08T20:54:35.830 回答
0

我想你的意思是类 C 数组。正如 Bjarne Stroustrup 所说,答案是因为“C 中的数组是一种非常愚蠢的数据类型,它甚至不知道它有多少元素。” 一旦数组衰减到指针,就无法知道“数组”中有多少元素。

于 2013-10-08T20:55:29.430 回答