多次元配列を持つクラス「foo」があり、getArray メンバーを介して配列のコピーを提供する必要があります。配列が動的に作成されるときにこれを行う良い方法はありますか?配列は常に削除、再作成などされるため、配列を const に戻すことはできません。新しい動的配列を作成して戻すことを考えましたが、これは呼び出し元のコードがこれを削除することなどを知る必要があるため、受け入れられます。
3 に答える
裸の配列ではなく、オブジェクトを返します。オブジェクトには、ユーザーのコピー、削除などを行うコピーコンストラクタ、デストラクタなどを含めることができます。
class Matrix {
// handle creation and access to your multidim array
// including copying, deletion etc.
};
class A { // your class
Matrix m; // the classes matrix
Matrix getArray() {
return m;
}
};
あなたの質問に対する簡単な答えは、配列の削除/解放を処理するクラスを作成する必要があるため、これは良い設計ではありません。
主なポイントは、なぜこの多次元配列を削除/再作成し続けるのですか? 1 つのインスタンスを作成して、必要に応じて変更することはできませんか?
個人的には、配列をそのまま返し、それを繰り返し処理し、ループ中に計算/関数を実行して、配列を作成/削除しないことでリソースを節約します。
ニールがおそらく最良の答えです。次善の策は、配列を使用しないことです。C++ では、動的配列について話すとき、それは を意味しvector
ます。
次の 2 つの可能性があります。
- ネストされたベクトル:
std::vector<int, std::vector<int> >(10, std::vector<int>(20))
- 単純なベクトル:
std::vector<int>(200)
どちらも200
アイテムになります。1 つ目は明らかに多次元ですが、2 つ目はオフセットを計算するタスクを残します。
2 番目はより多くの作業を要求しますが、10 個の中型チャンクを指す 1 つの小さなチャンクではなく、1 つの大きなチャンクが割り当てられるため、メモリに関してはよりパフォーマンスが高くなります...
しかし、ニールが言ったように、操作の正確なセットを定義するための独自の適切なクラスの方が優れています:)