如何获得数组的大小?

Iva*_*nov 10 c++ arrays

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

Joh*_*itb 17

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

这里有些例子:

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

int *pa = a; 
Run Code Online (Sandbox Code Playgroud)

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

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;
Run Code Online (Sandbox Code Playgroud)

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


Nol*_*rin 14

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

如果它确实存在问题,通常的解决方案是使用std::vector标准库中的类,它更接近托管(C#)数组,即存储其长度并且还具有一些有用的成员函数(用于搜索)和操纵).

使用std::vector,您只需调用vector.size()即可获得其大小/长度.


Pet*_*ham 5

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

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

对于标准容器,例如std::vector,使用该size() 功能.此模式还与boost阵列一起使用,这些阵列是固定大小的阵列,并且声称静态阵列没有更差的性能.您在上面评论中的代码应该是:

for ( std::vector::size_type i(0); i < entries.size(); ++i )
Run Code Online (Sandbox Code Playgroud)

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