从函数体中提取矩阵并作为参数传递

  • 本文关键字:参数传递 函数体 提取 c++
  • 更新时间 :
  • 英文 :


我有一个下面的函数,我必须提取矩阵c并将其作为参数传递,而不是在函数体中初始化它:

int ordonnancer (int n,  int n1, int m, vector <vector<int> > p, vector<int> ind){
int Cmax;
int c[m][n1];
//intialize matrix "c" with 0
for (int j=0;j<m;j++){ for(int i=0;i<n1;i++)  c[j][i]=0;  }
//first task
for (int j=0;j<m;j++){
for(int k=0;k<=j;k++){
c[j][ind[0]]=c[j][ind[0]]+p[k][ind[0]];
}
}
//first machine 
c[0][ind[0]]=0;
for (int i=0;i<n;i++){
for(int k=0;k<=i;k++){
c[0][ind[i]]=c[0][ind[i]]+p[0][ind[k]];
}
}
for(int i=1; i<n;i++){
for(int j=1; j<m;j++){
c[j][ind[i]]=max(c[j][ind[i-1]], c[j-1][ind[i]])+p[j][ind[i]];
}
}
Cmax=c[m-1][ind[n-1]];
return Cmax;
}

c++中有些结构是不能用的,有些结构是不应该用的。

c++不支持VLA,V可变的L蒜皮的rrays。一个像你在' int c[m][n1];'中定义的数组。'n1'和'm'都是变量。它们不是编译时常数。但是,这是c++的一个要求。所以,它不会工作。

关于向函数传递参数。基本上有3种方法:

  1. 按值传递。就像你在函数中做的那样。你交的所有参数都会被复印一份。外部世界看不到对函数中的这些变量做了任何修改。
  2. 通过指针传递。这在本质上也是按值传递,但在这里,变量的地址将被传递(按值)。如果我们对地址解引用,我们可以访问地址的值并修改它。因此,修改将在函数外部可见。然后你会在参数旁边看到一个"*"符号。
  3. 通过引用传递。对你来说,这是最好的解决方案。对原始变量的引用将传递给函数,如果您随后修改函数中的变量,则函数外部的引用值将被更新。此外,不会复制任何数据。这节省了时间和空间。你会在变量下面看到'&'

因此,您可以在函数之外定义vector<vector<int>> c。您可以根据需要初始化它,然后通过引用将其传递给函数体。

这还有一个额外的好处,即vector知道自己的大小。并且不需要提交参数mn1'. You can get the number of elements in a向量by using itssize()'-function

定义和初始化2dvector看起来有点复杂。因此,我将使用它的一个构造函数向您展示它。

vector<vector<int>> c(m, std::vector<int>(n1, 0));

这将定义一个2dvector,包含所需的元素数量,并将所有元素初始化为0。

你可以定义你的函数,例如,像这样:

int ordonnancer(int n, vector<vector<int>>& p, vector<int>& ind, vector<vector<int>>& c) {

请注意,我传递每个引用的所有vectors。参见'&象征。

在你的函数中,你可以得到你的循环的2d-vector的大小:

size_t m = c.size();
顺便说一下,你不应该使用using namespace std;。相反,您应该使用完全限定的名称,如std::vector

如果你需要进一步的帮助,请评论

最新更新