我有一个用java编写的代码,我想把它转换成c ++,我找不到计算c ++中数组长度的方法
Java代码:
public void printPerm(int[][] p){
for(int i=0;i<p.length;i++){
for(int j=0;j<p[i].length;j++)
System.out.print(p[i][j]);
System.out.println();
}
}
转换的c ++代码
void printPerm(int **p)
{
for (int i = 0;i < sizeof(p) / sizeof(p[0]) ;i++)
{
for (int j = 0;j < (p[i].length);j++)
{
cout << p[i][j];
}
cout << endl;
}
}
我需要在C ++中将“p [i] .length”转换为相应的一个,其中我将循环遍历数组p中的项目数,j将循环遍历数组p [i]中每个项目的长度
答案 0 :(得分:6)
在C ++中没有内置的方法来查找普通数组的长度。 (sizeof
仅在拥有原始数组时有效,而不是在有指针的情况下有效。)
有三种解决方案:
std::array
或std::vector
答案 1 :(得分:2)
那不行。 p
是一个指针,因此sizeof(p)
将是指针的大小 - 可能是8. p[0]
也是一个指针,因此它的大小将是相同的。
C ++原始数组不像Java数组那样存储它们的大小;你需要分别跟踪它。更好的策略可能是使用容器类(例如std :: vector)而不是原始数组。
答案 2 :(得分:1)
与Java c不同,C ++不传递数组的大小。
你必须自己做。
或者,有一个C ++的解决方案。
它被称为std :: vector,其行为方式与Java类似
答案 3 :(得分:1)
如果printPerm的参数确实是一个二维数组,则它不能隐式转换为int **类型。如果参数确实类型为int **,则需要声明另外两个参数,这两个参数将指定子数组的数量和每个子数组中的元素数。 C ++中的指针不会封装有关它们引用的元素数量的信息。
假设参数的定义方式如下
int m = 10;
int n = 20;
int **p = new int * [m];
for ( int i = 0; i < m; i++ ) p[i] = new int [n];
在这种情况下,该函数应定义为
void printPerm( const int **p, int m, int n )
{
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < n; j++ )
{
std::cout << p[i][j];
}
std::cout << std::endl;
}
}
并称为
printPerm( p, m, n );
如果参数的定义方式如下
const int M = 10;
const int N = 20;
int p[M][N];
然后应该按照以下方式定义函数
void printPerm( const int ( *p )[N], int m )
{
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < N; j++ )
{
std::cout << p[i][j];
}
std::cout << std::endl;
}
}
并称为
printPerm( p, M );
对于第二种情况,也有可能通过引用传递数组。函数定义将显示为
const int M = 10;
const int N = 20;
void printPerm( const int ( &p )[M][N] )
{
for ( int i = 0; i < M; i++ )
{
for ( int j = 0; j < N; j++ )
{
std::cout << p[i][j];
}
std::cout << std::endl;
}
}
可以称为
int p[M][N];
printPerm( p );
编辑:我更新了一些拼写错误。