我正在尝试从函数返回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;
}
答案 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
填充矩阵。