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()来获取其大小/长度。
- 不可能拿到尺寸吗?
- @约翰:是的,恐怕不可能。查看我更新的答案。STD::矢量可能是你最好的选择。
- 这是我的问题,如何得到STD::向量?它就像一个数组。我很抱歉误解,我是新的C++。
- @约翰:啊,够公平的。在C++中,通常使用两种类型的"数组"——本地的一个,它实际上是一个指针,而不是STD::vector类。
- "(int i=0;i <条目.Sig.I++)"-错误:"<":非法的,右操作数有类型"yxW64未签名int(yxTaseLSTD::vector < yt>::*)(空格)const
- John:EDCOX1(0)是该类的成员函数,而不是变量(或属性,它不存在于C++中)。因此,您需要添加括号,即size()。
- 我以为我必须使用64位整数,但问题出在括号里。谢谢。
- 用途:用于(尺寸_t i=0;i
要计算静态数组中的元素数,可以创建模板函数:
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 ) |
(假设循环中的大小发生变化,否则将其提升),而不是将大小视为成员变量。
- 为什么会这样?
- @Zingam模板?因为对数组的引用保留了数组的类型(包括大小),不像非引用参数退化为指针。
- 谢谢您!我不理解一半的模板,但我仍然无法理解为什么这个语句有效:t const(&;array)[n]我正在阅读的模板教程没有给我任何线索。
- @zingam参数定义是对T数组的常量引用,其大小为模板参数N。编译器根据传递给函数的数组的编译时类型推断出T类型和N大小。然后函数返回EDOCX1的值(4)。
Als Nolrodin指出,如果你只有一个指向它的第一个元素的指针,那么在C++中很难得到一个普通数组的大小。但是,如果您有一个固定大小的数组,那么在编译时有一个众所周知的C技巧来计算数组中元素的数量,即通过执行以下操作:
ZZU1〔0〕
在C/C++中,数组只是指向数组中的第一个元素的指针,所以没有办法跟踪元素的大小或元素。如果需要使用数组,则必须传递一个指示数组大小的整数。
字符串的长度可以通过使用strlen()函数来确定,假定它们以空结尾,但这只计算到 字符。