我试图以与此程序类似的方式有条件地初始化引用变量,但不可能以下列方式执行:
#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
,这样我就可以节省内存。
答案 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;