我有一个问题,如何从函数中有效地返回一个大的二维向量。 我的任务是读取一个大文件并返回一个矩阵数据。
设计一:
std::vector<std::vector<double> > loadMatrix(const char* fileName){
//read file
return matrix;
}
这个效率不高。
设计二:
std::vector<std::vector<double> >& loadMatrix(const char* fileName){
//read file
return matrix;
}
//get some errors
我只是想知道是否有办法解决这个问题。
答案 0 :(得分:3)
如果在函数内创建了向量,那么第一个实际上是未定义的行为。如果在函数内部创建了向量,您可以像这样返回它:
std::vector<std::vector<double> > loadMatrix(const char* fileName){
std::vector<std::vector<double> > matrix;
//read file
return matrix;
}
由于RVO(返回值优化),matrix
对象将被移动(或副本将被删除)。
答案 1 :(得分:0)
当您负担得起破坏性副本时,交换技巧涉及交换值而不是赋值:
原始代码:
std::vector<std::vector<double> > loadMatrix(const char* fileName){
//read file
return matrix; // Uses RVO
}
// create copy of temporary object returned by loadMatrix
std::vector<std::vector<double> > result = loadMatrix("matrixfile");
交换技巧:
std::vector<std::vector<double> > result;
result.swap(loadMatrix("matrixfile"));
交换技巧会将指针与临时交换。这将导致loadMatrix
返回的临时对象销毁一个空对象(默认构造在result
中)和result
以接收该值而不进行任何深层复制或重新分配。
交换技巧是在C ++ 11移动语义之前按值返回的快速解决方案。
答案 2 :(得分:0)
作为一个机会,如果你的编译器不支持移动语义,你也可以在这个函数中初始化矩阵:
bool loadMatrix(const char* fileName, std::vector<std::vector<double> > & matrix)
{
// shows if something went wrong
bool returnFlag = true;
// read file and init matrix
return returnFlag;
}
// create matrix
std::vector<std::vector<double> > matrix;
if (true == loadMatrix("matrixfile", matrix))
{
// do something
}
在这种情况下,不会执行矩阵复制。