new演算子を使用して次のコードを書くには? 詳しく説明してください。 ありがとうございます。mallocを新規に変換する
#include<alloc>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
}
new演算子を使用して次のコードを書くには? 詳しく説明してください。 ありがとうございます。mallocを新規に変換する
#include<alloc>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
}
を使用する必要がnew[]
場合new
は、int(*)[MAXCOL]
- 2D配列を減衰させるのと同じ型を返します。 delete[] p;
を忘れないでください。
最後の部分はstd::vector
の重要性を引き出します。おそらく、コンパイル時に2番目の次元のサイズを知っていると思われます。したがって、std::vector<std::array<int, MAXCOL>>
は、delete[]
文を必要とせず、そのサイズ(MAXROW)を知っているという追加ボーナスとともに機能します。可能であれば、これを使用してください。
実際、あなたの例では、両方の次元がコンパイル時にわかります。つまり、std::array<std::array<int, MAXCOL>, MAXROW>
もここで動作します。これは通常、動的割り当てよりも好ましい方法です。
コンパイル時にいずれの次元も分かっていない場合は、すべての内部ベクトルが同じサイズであることがわかっているときに、パフォーマンスを向上させるためにベクタのベクタまたは専用の行列クラスが最適です。
リテラル質問new演算子を使用して、次のコードを記述する方法
”?
&hellip;あなたが意味すると思う以外の何かを意味します。 C++ new
オペレータがユーザ定義さによって交換可能であることを除い
new
オペレータは、Cのmalloc
とほぼ直接的に類似した単純な割り当て関数です。
おそらくnew
表現を意味します。このような式では、割り当てのためにnew
演算子が呼び出され、割り当てられたものがクラス型の場合は、とが初期化用のコンストラクタを呼び出します。それはタイプセーフです。
でも、あなたの配列では、どちらでもかまいませんが、標準ライブラリのstd::vector
です。
ここで行列を作成するために、ベクトルのstd::vector
を使用した例です:
#include <vector>
using namespace std;
auto main()
-> int
{
int const n_rows = 3;
int const n_cols = 5;
using Row = vector<int>;
vector<Row> v(n_rows, Row(n_cols));
// E.g. v[1] is a row, and v[1][2] is an int item in that row.
}
あなたはそれほど頻繁に行列を使用しない場合でも、ラップすることをお勧めすることができクラス内の行列の一般的な概念。簡単な方法は、格納用に単一のstd::vector
を使用することです。 at
機能またはクライアントコードからの索引付けのためのoperator()
。あなた自身がこれをやっているような気がしていない場合は、 Boostライブラリは行列クラスを提供します。この以来
一般に、オブジェクトのようなN-Dim配列のネストされたベクトルの使用は避けます。物事を遅くする要素にアクセスするための複数の回帰があります。 – doug
@doug:私は同意します。だからこそ私は行列記憶装置として単一のベクトルを使うことを勧めました。単純な宣言がネストされた宣言の理由です。固定されています::)) –
単一のベクトルを使い、依然として2D組み込み配列のセマンティクスを使用する非常に簡単な方法があります。 (http://stackoverflow.com/questions/36123452/statically-declared-2-d-array-c-as-data-member-of-a-class/36123944#36123944) – doug
は、C++、私はstd::array
。またstd::unique_ptr
あなたがdelete
を使用する必要がnew
使用する場合は、free
非のallocや空きメモリを使用する必要がありますmalloc
を使用して使用してお勧めします。
p = new int[MAXROW][MAXCOL];
これはフリーストアに2次元配列(MAXCOLによってMAXROW)を割り当てて、といつものように:あなたは、文字通り質問に答えるために、簡単に言えばdelete[]
#include <cstdlib>
#include <memory>
#include <array>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
free(p); //free memory
array<int,MAXCOL> *p1 = new array<int,MAXCOL>[MAXROW];
delete []p1; //use this to delete the variable
array<array<int,MAXCOL>,MAXROW> *p2 = new array<array<int,MAXCOL>,MAXROW>;
delete p2; // normal delete for this one
auto p3 = make_unique<array<array<int,MAXCOL>,MAXROW>>();
//no delete needed for p3, it is a smart pointer.
}
「」は標準ヘッダーではありません。 'malloc'には' 'を使います。 –
chris