【发布时间】:2019-03-27 23:09:24
【问题描述】:
我的任务是在函数中生成一个由零组成的方阵并返回它。有很多方法可以做到这一点,但我决定不使用按值返回矩阵以提高效率。我采用了像in this answer 这样的指针方法,但由于它需要手动清理内存(而且据我所知最好使用智能指针),我决定将它变成std::unique_ptr,但我无法获得它工作。这是我的代码:
#include <iostream>
#include <memory>
std::unique_ptr<std::unique_ptr<int>[] > GenerateMatrix(const int &n) {
std::unique_ptr<std::unique_ptr<int>[] > matrix(new std::unique_ptr<int>[n]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix[i].get()[j] = 0;
}
}
return matrix;
}
int main() {
int n = 4;
auto matrix = GenerateMatrix(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
std::cout<<matrix[j].get()[i]<<" ";
}
std::cout<<std::endl;
}
return 0;
}
我在这里做错了什么?这种方法是否正确?
【问题讨论】:
-
std::unique_ptr<std::unique_ptr<int>[]>不是二维矩阵。你想要std::unique_ptr<std::unique_ptr<int[]>[]>。 -
std::vector<std::vector<int>>可能包含在课堂上。 (如果已包装,则将向量展平并手动进行索引计算以实现缓存友好) -
在这种情况下使用
std::unique_ptr并没有好处。 -
“有很多方法可以做到这一点,但我决定不使用按值返回矩阵以提高效率。”这个假设是错误的——请理解返回值优化和保证复制省略。 士气:过早优化是万恶之源
-
复制省略和移动语义都可以更好地在此处使用普通的
std::vector并按值返回。
标签: c++