【问题标题】:How create dynamically new 2D array in C++如何在 C++ 中动态创建新的二维数组
【发布时间】:2013-01-17 03:26:59
【问题描述】:

如主题中的如何在 C++ 中创建新的二维数组? 下面这段代码不太好用。

int** t = new *int[3];
for(int i = 0; i < 3; i++)
       t[i] = new int[5];

【问题讨论】:

  • 确实很接近,但首选RAII
  • “效果不佳”是什么意思?为什么不在另一个std::vector 中使用std::vector
  • 这个问题已经被问过很多次了。使用矢量...等等等等。我希望这样会在每个问题之前自动检测潜在的重复并要求确认(如果有潜在的重复)。

标签: c++ dynamic multidimensional-array


【解决方案1】:

您的* 放错了位置。试试:

int **t = new int *[3];

【讨论】:

  • +1,我希望我能再次投票以解决 问题 而不是重新发明轮子。
  • 在生产质量 C++ 代码中,我会使用像 std::vector 这样健壮的 RAII 容器,而不是使用 @ 分配的 raw 类 C 数组987654324@,除非有充分的理由不这样做。
【解决方案2】:

vector&lt; vector&lt; int &gt; &gt; 会起作用吗?

【讨论】:

  • Java 会更好,但不幸的是不能使用它; )
  • 只是好奇为什么不能使用 std 中的向量?它是任何 C++ 版本的一部分。
【解决方案3】:

您可能希望将二维矩阵“展平”为一维数组,将其元素存储在一个方便的容器中,例如std::vector(这比使用vector&lt;vector&lt;T&gt;&gt; 更有效)。然后可以将二维(row, column)矩阵索引映射到一维数组索引中。

如果将元素按行存储在矩阵中,则可以使用如下公式:

1D array index = column + row * columns count

您可以将其包装在一个方便的 C++ 类中(重载 operator() 以正确访问矩阵元素):

template <typename T>
class Matrix {
public: 
    Matrix(size_t rows, size_t columns)
        : m_data(rows * columns), m_rows(rows), m_columns(columns) {}

    size_t Rows() const { return m_rows; }

    size_t Columns() const { return m_columns; }

    const T & operator()(size_t row, size_t column) const { 
        return m_data[VectorIndex(row, column)];
    }

    T & operator()(size_t row, size_t column) {
        return m_data[VectorIndex(row, column)];
    }

private:
    vector<T> m_data;
    size_t m_rows;    
    size_t m_columns; 

    size_t VectorIndex(size_t row, size_t column) const {
        if (row >= m_rows)
            throw out_of_range("Matrix<T> - Row index out of bound.");
        if (column >= m_columns)
            throw out_of_range("Matrix<T> - Column index out of bound.");           
        return column + row*m_columns;
    }
};

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 2015-07-15
    • 2011-02-12
    • 1970-01-01
    • 2013-05-02
    • 2013-02-22
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多