-2
A
答えて
1
目的を達成するには2通りの方法があります。
最初の方法は、動的に割り当てられたCスタイルの配列を使用しています。既存のコードを強制的にサポートしない限り、C++でこれを行うべきではありません。しかし、この場合、おそらくリファクタリングを検討する方が良いでしょう。
第2の方法はstd::vector
を使用しています。このクラスは、低レベルの操作をメモリでカプセル化します。多くの潜在的なバグから解放されます。
私はstd::vector
の利点を示すために、2つのプログラムを書いています。彼らは2D配列のサイズを入力します(別の方法では行列と呼ばれます)。
Cスタイルの配列を使用して行列を作成すると、多くのコードとポインターによる操作が要求されます。 簡単にするために、次のコードは例外を処理しません。実際のコードでは、メモリリークを防ぐためにコードを実行する必要がありますが、コードはさらに難しくなります。
#include <iostream>
#include <cstddef>
using namespace std;
void function(int** matrix, size_t nrows, size_t ncols)
{
}
int main()
{
size_t nrows;
size_t ncols;
cin >> nrows >> ncols;
// allocate memory for matrix
int** matrix = new int*[nrows];
for (size_t i = 0; i < nrows; ++i)
matrix[i] = new int[ncols];
function(matrix, nrows, ncols);
// release memory
for (size_t i = 0; i < nrows; ++i)
delete[] matrix[i];
delete[] matrix;
}
したがって、C++では、std::vector
を使用すると非常に簡単になります。 std::vector
はクラスであるため、メモリの割り当てと解放をカプセル化するコンストラクタとデストラクタを持っています。
#include <iostream>
#include <vector>
using namespace std;
void function(vector<vector<int>>& matrix)
{
}
int main()
{
size_t nrows;
size_t ncols;
cin >> nrows >> ncols;
// create matrix
vector<vector<int>> matrix(nrows);
for (size_t i = 0; i < nrows; ++i)
matrix[i] = vector<int>(ncols);
// you don't even need to pass sizes of matrix
function(matrix);
// automatically called destructor of matrix releases memory
}
そのようにすることはできません。可変長配列はC++の機能ではありません。 'std :: vector>'を試してみてください。 –
StoryTeller
ポインタを使ってもこれを行うことはできませんか? – bubunny
できます。しかし、おそらく数時間かけて、あなたのプログラムが持つすべての違法メモリアクセスをデバッグすることになるでしょう。 'std :: vector'はあなたや私がポインタで手でこれらのことをする必要がないように設計されています。 – StoryTeller