2017-06-19 7 views
0

別の配列の変数を含む配列を作成したいのですが、変数をエイリアス(値ではなく)としてコピーする必要があります。ここで例えばC++のエイリアス変数の配列

int* x; 
int* y; 
int* z[4]; // What should I do if length of z is not known initially. 
x =new int[2]; 
y= new int[2]; 
x[0]=1; 
x[1] =2; 
y[0]=3; 
y[1]=4; 
z[0] =&x[0]; 
z[1] = &x[1]; 
z[2] =&y[0]; 
z[3] =&y[1]; 

、アレイzxyの参照によってなされます。 'z'の変更点はxyであり、その逆もあります。

必要なもの:
2)zは、整数へのポインタの配列です。どのように整数の配列に変換するのですか?

3)ポインタは管理が難しいため、どのようにベクトルを使って同じ機能を得るのですか。私の知識によると、ベクトルは参照を格納することができません。

+1

'std :: reference_wrapper'は助けになりますか? – Bathsheba

+0

あなたの問題が1)で理解できません。実行時にすでに 'z'を割り当てています。 2) 'z'は整数へのポインタの配列ではありません。 – Rakete1111

+0

と 'std :: vector'は生ポインタを置き換えます。 – Jarod42

答えて

1

アレイの概念は、メモリがシーケンシャルであることです。たとえば、arr[0]は最初の要素のアドレスで、これは*arrと同じです.2つ目の要素が必要な場合は、arr[1](*arr)+1)と入力します。 2つの配列の要素を持つ配列を作成する場合は、3番目の配列を作成して値をコピーする必要があります(z[0] = a[0]; ...) 動的割り当てでは、整数値を受け入れるコンストラクタを持つvectorを使用できます。 std::vector<int> z = std::vector<int>(a.size() + b.size())

これは、ポインタを格納せずに実行する唯一の方法です。 コンテナaからコンテナbに何かをコピーしてコンテナaでコンテナbを変更した場合、コンテナbでは変更されません。

+1

1)ベクトルは参照を格納できません。 'std :: reference_wrapper'でそれらをラップする必要があります。 2)refは制限されたポインタではありません。これは特定のオブジェクトのエイリアス名で、ポインタespとは異なる動作をします。オブジェクトのコピーに関する。あなたのコンパイラはおそらく実装の詳細*としてポインタ*としてのリファレンスを実装します。しかし、C++言語の観点から言えば、ポインタとリファレンスは別個のコンセプトであり、そのようなものについてはそれを薄くするのが良い考えです。 3)あなたのベクトルの例は擬似コードですか?いくつかのテンプレートパラメータがありません。 4)なぜ世界で '' std :: vector''を 'new'にしたいのですか? – besc

+0

私はあなたの質問に答えるか、私の答えを修正するだけですか? –

+0

これは主に訂正を意味していました。しかし、もしあなたが 'new 'というベクトルのための有効なユースケースを持っていれば、私は本当に興味があります。 – besc

0

代わりにこのコードスニペット

int *z; 
z = new int[N];  //N is integer. 
z = &x[0]; 

のあなたは

int **z; 
z = new int * [N];  //N is integer. 
z[0] = &x[0]; 

を書くべきか、あなたはクラステンプレートstd::vector<int *>の代わりに、配列を使用することができます。

関連する問題