1

3つのアレイを作成する必要がある割り当てがあります。最初の2つの配列には同様の要素があり、3番目の配列は空です。

const int arraySize = 4;
array k[arraySize] = {1, 2 ,3, 7}
array j[arraySize] = { 1, 2, 8, 9}
array u;

int *ptr1 = arrayk;
    int *ptr2 = arrayj;

最初の2つの要素を比較して、それらの重複を3番目の空の配列(array u)にコピーするにはどうすればよいですか?

私はこのようなことを考えていました:

for(int i = 0; i < arraySize; ++1) {
    for(int k = 0; k < arraySize; ++k) {
        if(&ptr1[i] == &ptr2[k]) {
            //copy elements that are duplicates to array u
          }
      }
}
4

2 に答える 2

1

STLを使用できる場合は、をお勧めしset_intersectionます。このリンクで使用されている例は次のとおりです。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  vector<int> v(10);                           // 0  0  0  0  0  0  0  0  0  0
  vector<int>::iterator it;

  sort (first,first+5);     //  5 10 15 20 25
  sort (second,second+5);   // 10 20 30 40 50

  it=set_intersection (first, first+5, second, second+5, v.begin());
                                               // 10 20 0  0  0  0  0  0  0  0

  cout << "intersection has " << int(it - v.begin()) << " elements.\n";

  return 0;
}

STLを使用できない場合は、このコードを検討してください(これもリンクから)。

この関数テンプレートの動作は、次と同等です。

template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
                                    InputIterator2 first2, InputIterator2 last2,
                                    OutputIterator result )
{
  while (first1!=last1 && first2!=last2)
  {
    if (*first1<*first2) ++first1;
    else if (*first2<*first1) ++first2;
    else { *result++ = *first1++; first2++; }
  }
  return result;
}
于 2012-08-13T19:00:49.640 に答える
0

宿題のように見えるので、図書館を使ってこれを達成するのではなく、自分でやりたいと思っていると思います。この場合、コードは問題ありません。次の使用可能な位置をu配列に格納するには、整数変数を保持する必要があります。

const int arraySize = 4; 
int next = 0; 
array k[arraySize] = {1, 2 ,3, 7};
array j[arraySize] = { 1, 2, 8, 9};
array u[arraySize]; // Because it at most be a copy of array k or j

for(int i = 0; i < arraySize; ++i) {
    for(int k = 0; k < arraySize; ++k) {
        if(arrayk[i] == arrayj[k]) {
            u[next++] = arrayk[i];
        }
    }
}

このようにして、重複を見つけたら、それをuの次に使用可能な位置に割り当ててから、nextの値を1つ増やします。

これがポインタバージョンですが、このような場合は避け、必要な場合にのみ使用することを強くお勧めします。

const int arraySize = 4; 
int next = 0; 
array k[arraySize] = {1, 2 ,3, 7};
array j[arraySize] = { 1, 2, 8, 9};
array u[arraySize]; // Because it at most be a copy of array k or j

int *ptr1 = arrayk;
int *ptr2 = arrayj;

for(int i = 0; i < arraySize; ++i) {
    for(int k = 0; k < arraySize; ++k) {
        if(*(ptr1 + i)  == *(ptr2 + k) {
            u[next++] = *(ptr1 + i);
        }
    }
}
于 2012-08-13T19:07:38.963 に答える