20

ヒープ上の配列の値を手動で開始するにはどうすればよいですか? 配列が (スタック内の) ローカル変数である場合、次のように非常にエレガントで簡単な方法で実行できます。

int myArray[3] = {1,2,3};

残念ながら、次のコード

int * myArray = new int[3];
myArray = {1,2,3};

コンパイルでエラーを出力する

error: expected primary-expression before ‘{’ token
error: expected `;' before ‘{’ token

このようなサイクル、またはそれほどエレガントではない方法を使用する必要がありますか?

myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
4

7 に答える 7

5

これは興味深い:配列をベクトルにプッシュする

ただし、それでもうまくいかない場合は、次のことを試してください。

#include <algorithm>
...


const int length = 32;

int stack_array[length] = { 0 ,32, 54, ... }
int* array = new int[length];

std::copy(stack_array, stack_array + length, &array[0]);
于 2010-12-31T17:35:51.980 に答える
3

{1,2,3}は、POD 構造の初期化に固有の非常に制限された構文です (明らかに、C スタイルの配列も 1 つと見なされていました)。あなたができることは likeint x[] = {1,2,3};またはだけですが、どちらも行うことも他の場所で使用するint x[3] = {1,2,3};こともできません。int x[3]; x={1,2,3};{1,2,3}

C++ を使用している場合は、C スタイルの配列の代わりに std::vector などを使用することをお勧めします。これらは危険と見なされるためです。たとえば、サイズがわからdelete[]ず、通常の ではなく で削除する必要がありますdelete。ただし、 std::vector を使用すると、同じ初期化の問題が引き続き発生します。このような初期化を頻繁に使用する場合、おそらく、ダミーのローカル変数に代入してメモリをコピー先にコピーするマクロを作成するでしょう。

編集:次のようにすることもできます(std::vectorがまだ望ましい):

int* NewArray(int v1, int v2, int v3) { /* allocate and initialize */ }
int* p = NewArray(1,2,3);

ただし、別の数の引数で関数をオーバーライドするか、これも安全ではない va_arg を使用する必要があります。

EDIT2: 私の答えは C++03 に対してのみ有効です。他の人が C++0x にはいくつかの改善点があると述べています。

于 2010-12-31T17:29:50.170 に答える
3

myConstArray[] = {1, 2, 3} のように定数配列を定義し、new int[3] の後に memcpy を実行できます。

于 2010-12-31T16:33:54.373 に答える
0

C++0x 標準には、特別な型と呼ばれるinitializer_list特別な構文と、そのための特別な構文があります (式の型は{1, 2, 3}ですstd::initializer_list<int>)。std::vectorそれからコンストラクターstd::arrayがあるので、書くことができますvector<int> v = {1, 2, 3}

C++98/C++03 には適切な解決策はありません。

于 2010-12-31T17:39:13.240 に答える
0

すべてのタイプで機能する一般的な答えが必要な場合は、次のようにします。

  1. malloc() または operator new() を使用して、nelts * sizeof(T) で計算された適切な長さの初期化されていないストレージの配列を作成します

  2. 各要素のコンストラクターの引数からなる配列を作成します。

  3. 対応する引数を使用して、コンストラクターを配置形式で各要素に適用します。

これは、同じコンストラクターがすべての要素に対して機能する場合にのみ機能します。そうでない場合は、各要素に適切なコンストラクターを選択するために、より複雑なデータ構造とアルゴリズムが必要になります。

これの特殊なケースは、実際の要素の配列を使用し、コピー コンストラクターを使用することです。その特殊なケースは、型が POD であり、memcpy を使用して一度にロットを構築できる場合です。

コンストラクターが 2 つの引数を取る場合、イニシエーター プロシージャー (ラッパー) を記述する必要があります。例えば:

pair<double> init_data[] = {make_pair(1.0,0.0), make_pair(3.0,4.0)};
void init(void *p, pair<double> d) { new (p) complex(d.first, d.second); }

new(p) の代わりにそれを使用します。

于 2010-12-31T17:43:17.580 に答える