有效地返回二维向量

时间:2014-01-22 09:32:34

标签: c++ matrix

我有一个问题,如何从函数中有效地返回一个大的二维向量。 我的任务是读取一个大文件并返回一个矩阵数据。

设计一:

 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

我只是想知道是否有办法解决这个问题。

3 个答案:

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

在这种情况下,不会执行矩阵复制。