ユーザー入力に基づく動的 2 次元配列
行列を操作する際の動的配列の必要性を理解し、それを実現するためのさまざまなアプローチを検討します。 C のこの柔軟性。
ベクトルのベクトル(vector
行列を表すベクトルのベクトルには、行と列へのアクセスを処理するユーザー定義クラスが必要です。この方法では動的にサイズ変更可能な配列が可能ですが、ネストされたポインターとメモリのオーバーヘッドにより非効率が生じる可能性があります。
Matrix Wrapper Class Template
別のアプローチは、単一のベクトルをラップするテンプレート クラス。ラッパーは行列の形状を追跡し、アクセス関数を提供します。
template <class T> class matrix { int columns_; std::vector<T> data; public: matrix(int columns, int rows) : columns_(columns), data(columns * rows) {} T& operator()(int column, int row) { return data[row * columns_ + column]; } };
このクラスは、operator[] の代わりに Operator() を使用した便利な添字アクセスを提供します。
オーバーロード Operator[ ] 複数のディメンション用
operator[] 構文を使用したい場合は、それをオーバーロードすることができます。ネストされたクラス構造:
template<class T, int size> class matrix3 { T data[size][size][size]; friend class proxy; friend class proxy2; class proxy { matrix3& m_; int index1_, index2_; public: proxy(matrix3& m, int i1, int i2) : m_(m), index1_(i1), index2_(i2) {} T& operator[](int index3) { return m_.data[index1_][index2_][index3]; } }; class proxy2 { matrix3& m_; int index_; public: proxy2(matrix3& m, int d) : m_(m), index_(d) {} proxy operator[](int index2) { return proxy(m_, index_, index2); } }; public: proxy2 operator[](int index) { return proxy2(*this, index); } };
このアプローチは C スタイルの行列アクセスを提供しますが、いくつかのボイラープレート コードが必要になる場合があります。
これらのオプションを理解することで、特定の用途に最も適切なアプローチを選択できます。行列コンテキストで動的 2 次元配列を操作する場合の要件。
以上がC で動的 2 次元配列を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。