【问题标题】:How to initialize a 2D array in a class?如何在类中初始化二维数组?
【发布时间】:2014-10-02 11:07:31
【问题描述】:

我有一个看起来像这样的 Matrix 类:

template<int R, int C>
class Matrix{
public:
    double matrix[R][C];
    Matrix(double n = 0)...{}
    ...
};

Matrix<2,3> m;

如何在 c'tor 中使用 n 创建新矩阵时初始化数组,而不逐个单元格地迭代整个数组?

我在这里阅读了一些关于 memset 的答案,但我目前无法使用它(这是家庭作业的一部分)。

【问题讨论】:

  • 将其初始化为“默认值”还是特定值?
  • 我已经提到我想用 n 作为 c'tor 的输入来初始化它(默认为 0)
  • 您可以使用标准算法,但无论如何它们都会在后台应用某种形式的迭代。否则,您将扮演自己的迭代角色。 memset 在这种情况下可以工作,但正如你所说,那是不可能的。
  • 这是一个测验(不是生产代码)吗?只有这样:在单线程应用程序中,您可以使用在 Matrix' ctor 中设置为 n 的静态值。如果你不公开你的实现,你可以有一个自定义元素类型包含一个double,它的ctor用n初始化包含的double。
  • 顺便说一下,memset 也会迭代! :-)

标签: c++ arrays templates constructor


【解决方案1】:

我的建议是尽可能使用标准算法:

    std::for_each(std::begin(matrix), std::end(matrix), 
              [n](double* row) { std::fill_n(row, C, n); } );       

完整示例:

template<int R, int C>
class Matrix{
public:
    double matrix[R][C];
    Matrix(double n = 0) {
         std::for_each(std::begin(matrix), std::end(matrix), 
                       [n](double* row) { std::fill_n(row, C, n); } );      
    }
};

【讨论】:

    【解决方案2】:

    使用清晰、简单、明显的代码遍历整个数组单元格。如果您的编译器是明智的(如果不是,为什么要使用它)它会准确地理解您在做什么,并为您的平台替换最佳初始化机制。

    【讨论】:

    • 这是唯一的方法吗?我希望有一些捷径可以做到这一点
    • “快捷方式”是什么意思?你的意思是更少的代码?
    • 我的意思是我可以做这样的事情int a[2][3] = {0},我知道它会将数组初始化为 0,我希望当它在一个类中时有一种方法可以做这样的事情
    • 但是作为 c'tor 的一部分,我怎样才能做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2011-04-12
    • 2016-05-25
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多