计算阵列的长度

时间:2009-07-14 10:20:14

标签: c++ arrays

我有一个如下所述声明的C ++数组:

CString carray[] =
{
        "A",
        "B",
        "C",
        "D",
        "E"
}

我想在运行时确定carray的长度。我在做:

int iLength = sizeof(carray)/sizeof(CString);

这是对的吗?

10 个答案:

答案 0 :(得分:24)

您可以使用以下功能模板。如果您使用的是Boost,则可以拨打boost::size

template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
    return N;
}

int iLength = size(carray);

然而,正如其他人已经说过的那样,您应该更喜欢std::vector到C风格的数组。

答案 1 :(得分:17)

是。如果声明的元素类型发生了变化,您也可以编写

int iLength = sizeof(carray)/sizeof(carray[0]);

答案 2 :(得分:6)

这是正确的,因为它使用元编程:

template <typename T, std::size_t N>
inline std::size_t array_size( T (&)[N] ) {
   return N;
};

当编译器看到数组定义时,你必须知道这是有效的,但是在它被传递给函数(它衰变成指针的地方)之后就不会这样了:

void f( int array[] )
{
   //std::cout << array_size( array ) << std::endl; // fails, at this point array is a pointer
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
   int array[] = { 1, 2, 3, 4, 5 };
   f( array );
   std::cout << array_size( array ) << std::endl; // 5
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5 
}

答案 3 :(得分:5)

这段代码是正确的,但在大多数情况下,有更好的方法来处理C ++中的数组。特别是因为此方法不适用于动态大小的数组。

对于此类情况,请使用表示动态大小数组的标准库类std::vector(即您可以插入和删除条目)。

答案 4 :(得分:1)

是的,这是正确的方法,但它只适用于数组大小在编译时已知并且在sizeof( array )语句的站点上可见的情况。它不适用于动态大小的数组 - 你需要使用其他方法,例如使用像stl :: vector这样的容器,或者将元素数作为单独的参数传递/存储。

答案 5 :(得分:0)

那不是运行时,它是编译时间。你使用的方式是正确的。请注意,Visual Studio定义了_countof函数,它执行相同的操作。

在运行时,无法确定长度。您要么自己保持长度,要么使用std::vector

答案 6 :(得分:0)

如果你有一个动态数组,你应该使用类似STL向量的东西。 http://www.cppreference.com/wiki/stl/vector/start

C ++中的普通数组是固定大小的,您需要手动分配内存以扩展动态数组。

如果在编译时知道数组大小,请使用常量而不是计算。

答案 7 :(得分:0)

博士中阅读 Ivan J. Johnson this文章。 Dobbs 期刊。我认为它涵盖了此处介绍的大部分解决方案。它还非常清楚地概述了每种方法的优点和缺点。

答案 8 :(得分:0)

Windows SDK(即windows.h标头)提供宏ARRAYSIZE,它以安全的方式实现此功能(即不能与非静态数组一起使用)

答案 9 :(得分:0)

最好的方法是使用宏并在需要大小的地方使用它。

#define MAX_ROWS 1048
int array[MAX_ROWS];

这样,即使在将数组作为参数传递的函数中,也可以使用MAX_ROWS。