如何获取数组的大小? [复制]

Posted

技术标签:

【中文标题】如何获取数组的大小? [复制]【英文标题】:How to get the size of an Array? [duplicate] 【发布时间】:2010-10-26 19:51:10 【问题描述】:

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

【问题讨论】:

考虑std::array 【参考方案1】:

这真的取决于你所说的“数组”是什么意思。 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 模板。

【讨论】:

有人提到std::extent了吗?【参考方案2】:

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

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

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

【讨论】:

无法获取大小? @John:是的,恐怕这不可能。请参阅我的更新答案。 std::vector 可能是你最好的选择。 这是我的问题,如何获取 std::vector 的大小?这就像一个数组。我的误解很抱歉,我是C++的新手。 @John:啊,很公平。在 C++ 中,通常使用两种类型的“数组”——原生数组,它实际上只不过是一个指针,以及 std::vector 类。 "for(int i = 0;i ::* )(void) const'【参考方案3】:

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

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 )

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

【讨论】:

@Zingam 模板?因为对数组的引用保留了数组的类型,包括大小,这与降级为指针的非引用参数不同。 谢谢!我不理解模板的一半,但我仍然无法弄清楚为什么这个语句有效:T const (&array)[ N ] 我正在阅读的关于模板的教程没有给我任何线索。 @Zingam 参数定义是对T 数组的常量引用,其大小是模板参数N。编译器从传递给函数的数组的编译时类型推导出类型T 和大小N。然后该函数返回 N 的值。【参考方案4】:

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

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

【讨论】:

-1 数组不是指针。【参考方案5】:

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

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

【讨论】:

以上是关于如何获取数组的大小? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7,如何获取/检查列表的大小? [复制]

如何在javascript中获取浏览器窗口大小? [复制]

如何在 C 中获取文件的大小? [复制]

如何在编译时获取数组大小?

Javascript:如何使用字符串数组获取对象属性? [复制]

如何获取数组嵌入数组猫鼬的大小?