我有一个C++数组,声明如下:
CString carray[] =
{
"A",
"B",
"C",
"D",
"E"
}
我希望在运行时确定的长度。 我正在进行以下操作:
int iLength = sizeof(carray)/sizeof(CString);
这个正确吗?
我有一个C++数组,声明如下:
CString carray[] =
{
"A",
"B",
"C",
"D",
"E"
}
int iLength = sizeof(carray)/sizeof(CString);
这个正确吗?
boost::size
函数。点击此处了解更多信息。template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
return N;
}
int iLength = size(carray);
正如其他人已经提到的那样,但是你应该更喜欢使用std::vector
而不是C风格的数组。
是的。如果声明的元素类型发生了变化,你也可以写成:
int iLength = sizeof(carray)/sizeof(carray[0]);
sizeof(array)/sizeof(0[array])
。 :) 这是一个有趣的想法。 - avakarsizeof(array)/sizeof(*array)
。这也很容易记住! - Saradhi这是正确的,因为它使用元编程,如下所示:
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
}
inline
的。此外,请注意,inline
关键字现在与代码内联几乎没有任何关系。它只是标记函数,以便链接器接受多个(但相同的)定义。 - avakarinline
关键字的程序。现代编译器也是如此,它们通常不再将inline
视为优化提示(或者至少允许从命令行设置此行为)。 - avakar这段代码是正确的,但在大多数情况下,在C++中处理数组有更好的方法。特别是因为这种方法无法处理动态大小的数组。
对于这种情况,请使用标准库类std::vector
代表动态大小的数组(即可以插入和删除条目)。
是的,这是正确的方法,但它只适用于在编译时已知数组大小并且在sizeof( array )
语句处可见的情况下。对于动态大小的数组,它将无法工作 - 您需要使用其他方法,例如使用容器如stl::vector或传递/存储元素数量作为单独的参数。
#define MAX_ROWS 1048
int array[MAX_ROWS];
这不是运行时,这是编译时。你使用的方式是正确的。请注意,Visual Studio定义了一个名为_countof
的函数,它执行相同的操作。
在运行时无法确定长度。您可以自己保存长度,或使用std::vector
。
vector
呢?必须要在很多地方使用它并不是一个理由。事实上,对于C风格的数组也是一样的。 - Konrad RudolphWindows SDK(即windows.h头文件)提供了宏ARRAYSIZE,以安全的方式实现此功能(即不使用非静态数组)