如何返回二维向量?

时间:2010-08-25 13:25:28

标签: c++ vector

我有一个创建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的大小。我该怎么办?

5 个答案:

答案 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;
}

`