在C#中我使用嵌入到数组中的Length属性来获取大小。 如何在C ++中做到这一点?
答案 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);