我有一个创建2D矢量的功能
void generate(int n)
{
vector< vector<int> > V (n, vector<int>(1 << n , 0 ));
.......
}//n is used to determine the size of vector
现在,我需要返回创建的向量以在另一个函数中使用它。如果我做了
return V ;
这是错误的,因为V是一个局部变量,但是我不能在函数外定义V,因为这个函数定义了V的大小。我该怎么办?
答案 0 :(得分:11)
你可以return V
没有问题 - 它将返回局部变量的副本。只有当您将引用或指针返回到具有本地范围的变量时才会出现问题;当函数结束时,局部变量超出范围并被销毁,并且引用/指针不再有效。
或者,您可以接受对向量的引用作为参数,写入并返回void:
void generate(int n, std::vector< std::vector<int> >& vec) {
vec.resize(n, std::vector<int>(1 << n, 0));
}
int main() {
std::vector< std::vector<int> > v;
generate(10, v);
}
这比返回本地成员的副本更快,对于诸如多维向量之类的大对象来说这可能是昂贵的。
答案 1 :(得分:5)
vector<vector<int> > generate(int n)
{
vector<vector<int> > v(n, vector<int>(1 << n, 0));
//...
return v;
}
返回值是局部变量v
的副本,因此完全没有问题。
如果您担心复制矢量,也许您可以这样做:
void generate(int n, vector<vector<int> >& v)
{
v.clear(); //not necessary if you're sure it's empty
v.resize(n, vector<int>(1 << n, 0));
//...
}
答案 2 :(得分:0)
如果矢量很小,只需按值返回,它就会被复制。 如果向量很大,调用者可以通过引用传递dest向量。
答案 3 :(得分:0)
作为其他答案的替代方法,您可以返回指向堆分配向量的指针。为了防止内存泄漏,您可以使用“移动构造函数”的习惯用法。
typedef auto_ptr<vector<vector<int> > > vector_ptr;
vector_ptr generate(int n)
{
vector_ptr V(new vector<vector<int> >(n, vector<int>(1 << n , 0 )));
return V;
}
// ...
vector_ptr V(generate(some_number));
这个习语可以用于任何“沉重”的对象。如果你想延长返回对象的生命周期,你可以将它分配给shared_ptr(例如boost :: shared_ptr)。但我认为,只要有可能,最好尽可能地返回副本,以最大限度地降低代码的复杂性。
答案 4 :(得分:0)
就像我们为别人做的一样,我们也可以在这里做。请参见我的代码以获得更好的解释。我给出了我的矩阵乘法代码,其中我为此做了一个函数,并将矩阵返回为 2D向量。 `
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> mul(vector<vector<int>> a,vector<vector<int>> b)
{
int n=a.size();
int k=a[0].size();
int m=b[0].size();
vector<vector<int>> c(n,vector<int> (m,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
c[i][j]=0;
for(int m=0;m<k;m++)
{
c[i][j]+=(a[i][m]*b[m][j]);
}
}
}
return c;
}
int main() {
vector<vector<int>> l={{1,2}};
vector<vector<int>> r={{1,2,3},{4,5,6}};
vector<vector<int>> m;
m=mul(l,r);
for(int i=0;i<m.size();i++)
{
for(int j=0;j<m[i].size();j++)
{
cout<<m[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
`