C++ 如何在c+中将动态二维传递给函数+;
根据c99标准,这是一个有效的代码,该代码段在gcc编译器上运行良好C++ 如何在c+中将动态二维传递给函数+;,c++,arrays,function,multidimensional-array,C++,Arrays,Function,Multidimensional Array,根据c99标准,这是一个有效的代码,该代码段在gcc编译器上运行良好 #include <stdio.h> void foo( int n, int m, int a[][m]){ //do stuff } int main() { int n, m; scanf("%d %d", &n, &m); int a[n][m]; foo(n, m, a); r
#include <stdio.h>
void foo( int n, int m, int a[][m]){
//do stuff
}
int main() {
int n,
m;
scanf("%d %d", &n, &m);
int a[n][m];
foo(n, m, a);
return 0;
}
#include <cstdio>
#include <iostream>
using namespace std;
void foo( int n, int m, int a[][m]){
//do stuff
}
int main() {
int n,
m;
cin >> n >> m;
int a[n][m];
foo(n, m, a);
return 0;
}
<> p>我不能在C++中找到简单的解决方案,因为C在这个问题上是可用的。 首先,必须在[Cux]int [][][M]<代码>中替换“代码”> M/<代码>,因为你不能用变量定义函数头中的数组列。 其次,不能像前面那样声明大小可变的数组,这里也必须使用常量 但是,如果要使用可变大小的数组,可以动态创建数组
int** a = new int*[n]; // It creates an array of pointers of size n
然后你可以循环这个指针数组,给每个指针分配一个整数数组
for (int i = 0; i < n; i++){
a[i] = new int[m];
}
当您使用完数组后,您必须取消分配动态分配的数组
for (int i = 0; i < n; i++){
delete[] a[i];
a[i] = 0;
}
delete[] a;
a = 0;
使用vector
时,您不必担心动态分配或取消分配,vector
类自己处理此类内容。
< C++ >这个问题的一个简单的解决方案是使用2D向量< /p>
向量向量数组(10,向量(10))
并通过引用和vec2DArray
将其传递给函数
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
// function to pass 2d vector array by reference &
void function( int n, int m, vector <vector<int> > & vec2DArray ) {
for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++ ){
// perform some calculations
vec2DArray[y][x] = (y+1) * (x+1) *m *n;
}
}
}
int main() {
cout<<"function to pass 2d vector array by reference & \n\n";
// create a 2D vector of dimension [10][10]
vector <vector<int> > vec2DArray( 10, vector <int> (10) );
int n=0, int m=0;
// call function, pass 2d vector array by reference &
function( 1, 1, vec2DArray );
// display calculation results
for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++ ){
// display vec2DArray
cout << setfill(' ') << setw(2)<< vec2DArray[y][x] <<" ";
}
cout<<"\n";
}
cout<<"\n";
cout<<"Press ANY key to close.\n\n";
cin.ignore(); cin.get();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
//函数通过引用传递二维向量数组&
void函数(int n、int m、vector和vec2DArray){
对于(In y=0;你为什么期望两种不同的语言具有相同的特征?如果你使用C++,为什么不使用向量?你不会相信这里有多少用户在C多维数组中存在问题。@ AbHeHekJaysWAL如果你想学习C++,请检查。@ AbHeHekJasiWalC++不是C类的,它是不同的语言,而且是落后的。S兼容性是迄今为止的——可变长度数组,你试图使用的东西,是C++不支持的东西之一。如果你想真正学习C++,我鼓励你学习C++而不是学习如何编写C++编译器将接受的C。奥拉夫,我认为这是因为LLA的不幸命名。C++,它可以是…d,没有人期望D是与C兼容的源代码。此外,C++有一种表示C++应该被增强/改进的C,所以它有点反直觉,它缺少C的特性(当然它本身是好的,因为它是不同的语言,而不是C的版本).在向量向量示例中,向量a(n,向量(m));
不需要循环。关于最后一个示例,由于VLA与C中的规则数组一样,通过第一个元素地址作为其值传递,因此将向量向量传递给foo
的逻辑同义操作将通过引用。如文所述,它是通过值传递的。
for (int i = 0; i < n; i++){
delete[] a[i];
a[i] = 0;
}
delete[] a;
a = 0;
vector<vector<int>> a(n, vector<int>(m));
void foo(const vector<vector<int>>& a){
size_t n = a.size();
size_t m = 0;
if (n > 0)
m = a[0].size();
// do your work
}
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
// function to pass 2d vector array by reference &
void function( int n, int m, vector <vector<int> > & vec2DArray ) {
for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++ ){
// perform some calculations
vec2DArray[y][x] = (y+1) * (x+1) *m *n;
}
}
}
int main() {
cout<<"function to pass 2d vector array by reference & \n\n";
// create a 2D vector of dimension [10][10]
vector <vector<int> > vec2DArray( 10, vector <int> (10) );
int n=0, int m=0;
// call function, pass 2d vector array by reference &
function( 1, 1, vec2DArray );
// display calculation results
for (int y=0; y<10; y++ ){
for (int x=0; x<10; x++ ){
// display vec2DArray
cout << setfill(' ') << setw(2)<< vec2DArray[y][x] <<" ";
}
cout<<"\n";
}
cout<<"\n";
cout<<"Press ANY key to close.\n\n";
cin.ignore(); cin.get();
return 0;
}