如何获得数组的大小?

时间:2009-05-17 08:43:49

标签: c++ arrays

在C#中我使用嵌入到数组中的Length属性来获取大小。 如何在C ++中做到这一点?

5 个答案:

答案 0 :(得分:16)

这真的取决于你对“数组”的意思。 C ++中的数组将具有一个大小(现在表示“原始”字节大小),等于一个项目大小的N倍。通过该方法,可以使用sizeof运算符轻松获取项目数。但这要求您仍然可以访问该数组的类型。一旦将它传递给函数,它将被转换为指针,然后你就丢失了。无法确定尺寸。您将不得不构建一些依赖于元素值来计算大小的其他方法。

以下是一些例子:

int a[5];
size_t size = (sizeof a / sizeof a[0]); // size == 5

int *pa = a; 

如果我们现在丢失名称“a”(及其类型),例如通过将“pa”传递给一个函数,其中该函数只有那个指针的值,那么我们就不走运了。然后我们再也无法收到尺寸了。我们需要将大小和指针一起传递给该函数。

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

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

答案 1 :(得分:14)

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

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

使用std::vector,您只需致电vector.size()即可获得其尺寸/长度。

答案 2 :(得分:5)

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

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

对于std::vector等标准容器,使用size() 功能。此模式也与boost arrays一起使用,它们是固定大小的数组,并且声称静态数组没有更差的性能。您在上述评论中的代码应为:

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

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

答案 3 :(得分:0)

在C / C ++中,数组只是指向数组中第一个元素的指针,因此无法跟踪元素的大小或数量。如果需要使用它,则必须传递一个指示数组大小的整数。

字符串可能通过使用strlen()函数确定它们的长度,假设它们是空终止的,但这只是计数直到\ 0字符。

答案 4 :(得分:0)

Als Nolrodin上面指出,如果你只有一个指向第一个元素的指针,那么在C ++中获取普通数组的大小几乎是不可能的。但是,如果你有一个固定大小的数组,那么有一个众所周知的C技巧可以在编译时计算出数组中元素的数量,即通过这样做:

GrmblFx loadsOfElements[1027];
GrmblFx_length = sizeof(loadsOfElements)/sizeof(GrmblFx);