关于c ++:如何获得数组的大小?

How to get the size of an Array?

本问题已经有最佳答案,请猛点这里访问。

在C中,我使用嵌入到数组中的长度属性,我想获得的大小。如何在C++中做到这一点?


这真的取决于你所说的"数组"是什么意思。C++中的数组将具有一个大小(即现在的"原始"字节大小),等于一个项目的大小N倍。这样,使用sizeof操作符可以很容易地得到项目的数量。但这要求您仍然可以访问该数组的类型。一旦您将它传递给函数,它将被转换为指针,然后您将丢失。无法再确定尺寸。您将不得不构建一些依赖于元素值来计算大小的其他方法。

以下是一些例子:

1
2
3
4
int a[5];
size_t size = (sizeof a / sizeof a[0]); // size == 5

int *pa = a;

如果我们现在失去了名称"a"(以及它的类型),例如通过将"pa"传递给一个函数,该函数只有该指针的值,那么我们就走运了。我们就不能再收到尺寸了。我们需要将大小和指针一起传递给该函数。

当我们使用new获得一个数组时,同样的限制也适用。它返回指向该数组元素的指针,因此大小将丢失。

2

它不能返回包含数组类型的指针,因为可以在运行时计算使用new创建的数组的大小。但是C++中的类型必须在编译时设置。因此,new将删除该数组部分,并返回指向元素的指针。请注意,您不需要在C++中与EDCOX1第5条混淆。您可以使用其他答案推荐的std::vector模板。


C/C++中的数组不将它们的长度存储在内存中,因此不可能仅在给定数组的指针的情况下找到它们的大小。在这些语言中使用数组的任何代码都依赖于一个恒定的已知大小,或者传递一个指定其大小的单独变量。

如果确实存在问题,解决这个问题的一个常见方法是使用标准库中的std::vector类,它更接近于托管(C)数组,即存储其长度,另外还有一些有用的成员函数(用于搜索和操作)。

使用std::vector,您可以简单地调用vector.size()来获取其大小/长度。


要计算静态数组中的元素数,可以创建模板函数:

1
2
3
4
5
template < typename T, size_t N >
size_t countof( T const (&array)[ N ] )
{
    return N;
}

对于标准容器,如std::vector,使用size()功能。这种模式也用于Boost数组,Boost数组是固定大小的数组,对静态数组没有更差的性能。上面注释中的代码应该是:

1
for ( std::vector::size_type i(0); i < entries.size(); ++i )

(假设循环中的大小发生变化,否则将其提升),而不是将大小视为成员变量。


Als Nolrodin指出,如果你只有一个指向它的第一个元素的指针,那么在C++中很难得到一个普通数组的大小。但是,如果您有一个固定大小的数组,那么在编译时有一个众所周知的C技巧来计算数组中元素的数量,即通过执行以下操作:

ZZU1〔0〕


在C/C++中,数组只是指向数组中的第一个元素的指针,所以没有办法跟踪元素的大小或元素。如果需要使用数组,则必须传递一个指示数组大小的整数。

字符串的长度可以通过使用strlen()函数来确定,假定它们以空结尾,但这只计算到字符。