从函数返回二维向量

时间:2018-11-18 13:17:08

标签: c++ vector

我正在尝试从函数返回2D向量,但是我收到“没有用户定义的转换”错误。

std::vector<double> fillMatrix(double *data, int rows, int cols) {
    std::vector < std::vector<double> > matrix;
    int cnt = 0;
    for (int i = 0; i < rows; i++) {
        std::vector<double>temp;
        for (int j = 0; j < cols; j++) {
            temp.push_back(data[cnt++]);
        }
        matrix.push_back(temp);
    }
    return  matrix;
}

1 个答案:

答案 0 :(得分:0)

如果希望函数返回2D向量,则不应声明它返回 1D 向量。也就是说,应该是

std::vector<std::vector<double>> fillMatrix(double *data, int rows, int cols) {

但是,我强烈建议您不要这样做。如果由于某种原因无法使用返回值优化,则在return语句中调用rows + 1的{​​{1}}复制构造函数将产生大量开销。如果情况变得更糟,则在赋值运算符处调用另一个vector复制构造函数,例如rows + 1

此外,语句myMatrix = fillMatrix(...)还会临时复制所有元素。

处理大型对象时,应该考虑通过引用而不是通过值传递对象。使用智能指针进行内存管理或将目标对象作为对matrix.push_back(temp)的引用,而不是分配返回值。


至少函数名称具有误导性。它创建一个矩阵,而不是填充一个矩阵。 fillMatrix的签名应该像

fillMatrix

请注意,由于矩阵已经具有其大小,因此不再需要void fillMatrix(const double *data, std::vector<std::vector<double>> &matrix) { rows参数。当然,在这种情况下,您不应使用cols填充矩阵。