24

C++ で 2 つの int 配列を取得する方法はありますか

int * arr1;
int * arr2;
//pretend that in the lines below, we fill these two arrays with different
//int values

そして、それらを両方の配列の値を含む 1 つの大きな配列に結合しますか?

4

6 に答える 6

35
int * result = new int[size1 + size2];
std::copy(arr1, arr1 + size1, result);
std::copy(arr2, arr2 + size2, result + size1);

単なる提案ですvectorが、ポインタではなく動的配列としてうまくいくでしょう

于 2012-10-09T00:35:26.447 に答える
16

配列を使用している場合は、すべての値を格納するのに十分な大きさの新しい配列を割り当ててから、値を配列にコピーする必要があります。これには、配列のサイズなどを知る必要があります。

配列の代わりに使用std::vectorすると (他の利点があります)、これはより簡単になります。

std::vector<int> results;
results.reserve(arr1.size() + arr2.size());
results.insert(results.end(), arr1.begin(), arr1.end());
results.insert(results.end(), arr2.begin(), arr2.end());
于 2012-10-09T00:29:53.087 に答える
4

もう 1 つの方法は、式テンプレートを使用して、2 つが連結されているふりをすることです (遅延評価)。いくつかのリンク (追加のグーグルを実行できます):

http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/ http://www.altdevblogaday.com/2012/01/23/abusing-c-with-expression-templates/ http:/ /aszt.inf.elte.hu/~gsd/halado_cpp/ch06s06.html

使いやすさを求める場合は、次の方法を試してください。

#include <iostream>
#include <string>

int main()
{
  int arr1[] = {1, 2, 3};
  int arr2[] = {3, 4, 6};

  std::basic_string<int> s1(arr1, 3);
  std::basic_string<int> s2(arr2, 3);

  std::basic_string<int> concat(s1 + s2);

  for (std::basic_string<int>::const_iterator i(concat.begin());
    i != concat.end();
    ++i)
  {
    std::cout << *i << " ";
  }

  std::cout << std::endl;

  return 0;
}
于 2012-10-09T01:13:38.860 に答える
0

int * arr1 と int * arr2 を指定すると、このプログラムは int * arr3 で両方の配列の要素を連結します。残念ながら、C++ では、コピーする各配列のサイズを知る必要があります。しかし、これは、arr1 からコピーする要素の数と arr2 からコピーする要素の数を選択する際の障害にはなりません。

#include <iostream>
using namespace std;

int main(){
int temp[] = {1,2,3,4};
int temp2[] = {33,55,22};
int * arr1, * arr2, *arr3;
int size1(4), size2(3); //size1 and size2 is how many elements you 
//want to copy from the first and second array. In our case all.
//arr1 = new int[size1]; // optional
//arr2 = new int[size2];

arr1=temp;
arr2=temp2;

arr3 = new int; 
//or if you know the size: arr3 = new int[size1+size2];

for(int i=0; i<size1+size2; i++){
    if (i<size1)
        arr3[i]=arr1[i];
    else
        arr3[i] = arr2[i-size1];
}
cout<<endl;
for (int i=0; i<size1+size2; i++) {
    cout<<arr3[i]<<", ";
}

}
于 2015-03-01T20:44:35.677 に答える
0
for (int i = 0; i< arraySize * 2; i++)
{
    if (i < aSize)
    {
        *(array3 + i) = *(array1 + i);
    }
    else if (i >= arraySize)
    {
        *(array3 + i) = *(array2 + (i - arraySize));
    }

}

ベクトルは必要ありません。私のプログラミングクラスでも同様の問題がありました。これが役に立てば幸いです。ポインター演算を使用する必要がありました。これは、array1 と array2 がサイズ「aSize」に動的に初期化されることを前提としています。

于 2013-10-14T21:28:12.133 に答える