我有一个C++数组声明如下所述:
CString carray[] =
{
"A",
"B",
"C",
"D",
"E"
}
Run Code Online (Sandbox Code Playgroud)
我想确定carray运行时的长度.我在做:
int iLength = sizeof(carray)/sizeof(CString);
Run Code Online (Sandbox Code Playgroud)
它是否正确?
ava*_*kar 24
您可以使用以下功能模板.如果你正在使用Boost,你可以打电话boost::size.
template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
return N;
}
int iLength = size(carray);
Run Code Online (Sandbox Code Playgroud)
然而,正如其他人已经说过的那样,你应该更喜欢std::vectorC风格的数组.
Tim*_*mbo 17
是.如果声明的元素类型发生变化,您也可以编写
int iLength = sizeof(carray)/sizeof(carray[0]);
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为它使用元编程:
template <typename T, std::size_t N>
inline std::size_t array_size( T (&)[N] ) {
return N;
};
Run Code Online (Sandbox Code Playgroud)
你必须知道,当编译器看到数组定义时,这是有效的,但是在它被传递给函数(它衰变成指针的地方)之后就不会这样:
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
}
Run Code Online (Sandbox Code Playgroud)
这段代码是正确的,但在大多数情况下,有更好的方法来处理C++中的数组.特别是因为此方法不适用于动态大小的数组.
对于这种情况,请使用std::vector表示动态大小数组的标准库类(即,您可以插入和删除条目).