如何在函数中初始化矩阵并在C ++中有效地将其返回?

时间:2019-03-27 13:46:45

标签: c++

我的任务是在函数中生成零的方阵并将其返回。有很多方法可以做到这一点,但是我决定不为了效率而按值返回矩阵。我采用了类似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;
}

我在这里做什么错?这种方法甚至正确吗?

4 个答案:

答案 0 :(得分:1)

为什么不仅仅让您的生活更轻松

vector<vector<int>> generate (int m, int n)
{
    return vector<vector<int>>(m ,vector<int>(n));
}

int main()
{
    int m = 3, n = 4;
    auto matrix = generate(m, n);  // a 3-by-4 matrix of zeros
    return 0;
}

答案 1 :(得分:1)

只需依靠保证复制清除返回值优化

std::vector<int> GenerateMatrix(const int &n) {
    return std::vector<int>(n*n, 0);//, 0 can be omitted (as elements will then be zero-initialized)
}

答案 2 :(得分:0)

您可以在编译时创建和初始化矩阵。例如:

template<int RowCount, int ColumnCount, int DefaultValue = 0>
struct Matrix
{
  static_assert(RowCount >= 0 && ColumnCount >=0,
                "The number of rows and columns should be positive");
  struct Row
  {
    int column[ColumnCount] = { DefaultValue };
  };
  Row row[RowCount];
};

并像这样使用它:

Matrix<2, 2, 33> matrix;
auto val = matrix.row[0].column[0]; // val == 33
matrix.row[0].column[0] = 55;
val = matrix.row[0].column[0]; // val == 55

当按行和列引用其元素时,请注意矩阵的尺寸。

答案 3 :(得分:-2)

您没有为矩阵分配足够的内存。更改此行:

std::unique_ptr<std::unique_ptr<int>[] > matrix(new std::unique_ptr<int>[n*n]);

此外,由于您实际上是在处理一维数组,因此我只使用i*n + j进行访问:

#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*n]);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      matrix.get()[i*n+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.get()[i*n+j]<<" ";
    }
    std::cout<<std::endl;
  }

  return 0;
}