0

行列の要素にメモリを割り当てる2つの異なる方法を調べました

方法n.1

int** matrix = new int*[rows];
for (int i = 0; i < rows; ++i)
    matrix[i] = new int[cols];

方法n.2

int** matrix = new int*[rows];
if (rows)
{
    matrix[0] = new int[rows * cols];
    for (int i = 1; i < rows; ++i)
        matrix[i] = matrix[0] + i * cols;
}

メソッド n.1 が何をするかはわかりますが、メソッド n.2 の if 句が正確に何をするのかわかりません (if 句なしで実装すると、動作しません。します...)

編集:これは私の問題を示すコードです。読み込みに時間がかかるのはなぜですか (~30 秒)?

http://codepad.org/uKvI8Tk3

Codepad は出力を表示することを拒否します (タイムアウト)。実行したい場合は、自分でコンパイルしてください。

また、プログラムが開始されると cout << ステートメントが実行されないのはなぜですか?

4

2 に答える 2

5

メソッドn.3:内部で単一std::vector<int>を使用し、(row、col)インデックスによるアクセスについて賢く、独自のMatrixクラスを記述します。

struct Matrix
{
  explicit Matrix(unsigned int rows, unsigned int cols) : data_(rows*cols), cols_(cols) {}
  const int& operator()(unsigned int row, unsigned int col) const
  {
    return data_[row*cols_ + col];
  }
 private:
  std::vector<int> data_;
  unsigned int cols_;
};

編集:最後の例でベクトルのメモリオーバーヘッドが問題である場合は、動的に割り当てられた単一の長さの配列の使用を検討し、デストラクタでそれrows*colsを呼び出すようにしてください。delete []

于 2013-02-17T22:22:58.663 に答える
2

方法 n.2 は、すべての行のシーケンスを含む一意のブロックを割り当てています。したがって、最初の行はブロック全体へのポインターです。行 == 0 の場合、(空の) スペースへのポインターを保持するスペースがないため、割り当てを行うことができません。

他の回答で提案されている方法 4 に進みます。

class Matrix {
   Matrix(int rows, int cols): rows_(rows), cols_(cols) {
      data_ = new int[rows*cols];
   }

   ~Matrix() {
       delete[] data_;
   }

   int &operator()(int i,int j) {return data_[cols_*i+j];}

   int operator()(int i,int j) const {return data_[cols_*i+j];}

 private:
   int rows_,cols_;
   int *data_;
};
于 2013-02-17T22:30:24.697 に答える