有条件地在C ++中定义引用变量

时间:2017-02-16 21:41:41

标签: c++

我试图以与此程序类似的方式有条件地初始化引用变量,但不可能以下列方式执行:

#include <vector>

void test(bool val){

  std::vector<std::vector<int> > mat(10, std::vector<int>(10, 0));
  std::vector<std::vector<int> > &ref_mat; // This is not allowed

  if(val){
    ref_mat = mat;
  }else{
    std::vector<std::vector<int> > mat2 = Somefunction(); // The returned 2D vector from some function
    ref_mat = mat2;
  }

}

可以用不同的方式完成吗?我需要在必要时只创建一个新对象mat2,这样我就可以节省内存。

3 个答案:

答案 0 :(得分:9)

如何更好地构建代码:

std::vector<std::vector<int>> mat =
     val ? std::vector<std::vector<int>>(10, std::vector<int>(10, 0))
         : SomeFunction();

根本不需要参考!

如果总是需要默认向量,并且只是有条件地需要另一个向量,那么你可以做更长时间的事情:

std::vector<std::vector<int>> mat_dflt(10, std::vector<int>(10, 0));
std::vector<std::vector<int>> mat_cond;  // small when empty!

auto & mat = val ? mat_dflt : (mat_cond = SomeFunction());

(请注意,空向量仅占用堆栈上的非常小的空间。)

答案 1 :(得分:2)

我喜欢将我的功能分成尽可能多的小功能。

这是另一种选择。

std::vector<std::vector<int> > getDefaultArray()
{
   return std::vector<std::vector<int> >(10, std::vector<int>(10, 0));
}

std::vector<std::vector<int> > getArray(bool val)
{
   return val ? getDefaultArray() : Somefunction();
}

void test(bool val)
{
   std::vector<std::vector<int> > mat = getArray(val);
   // Use mat
   // ...
}

答案 2 :(得分:0)

如果您确实想使用引用,可以先使用指针解决此问题:

std::vector<std::vector<int> > mat(10, std::vector<int>(10, 0));
std::vector<std::vector<int> > *p_mat;

if(val)
    p_mat = &mat;
else
    p_mat = &SomeFunction();

std::vector<std::vector<int> > &ref_mat = *p_mat;