如何返回二维向量?

Ahm*_*med 1 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
Run Code Online (Sandbox Code Playgroud)

现在,我需要返回创建的向量以在另一个函数中使用它.如果我这样做了

return V ;
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为V是一个局部变量,但我不能在函数外定义V,因为这个函数定义了V的大小.我该怎么办 ?

mea*_*gar 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);
}
Run Code Online (Sandbox Code Playgroud)

这比返回本地成员的副本更快,这对于诸如多维向量之类的大对象来说可能是昂贵的.

  • 这也是值得注意的RVO和NRVO.这些编译器优化将通过将副本更改为已发布的generate形式来有效地删除按值返回的副本.您应该始终只按值返回局部变量,并在分析显示问题时手动执行此优化. (6认同)

Job*_*Job 5

vector<vector<int> > generate(int n)
{
    vector<vector<int> > v(n, vector<int>(1 << n, 0));
    //...
    return v;
}
Run Code Online (Sandbox Code Playgroud)

返回值是局部变量的副本,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));
    //...
}
Run Code Online (Sandbox Code Playgroud)