1

我有一个任务,我必须创建 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;

如何比较前两个中的元素,然后将这些重复项复制到第三个空数组(数组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 的值增加一。

这是指针版本,尽管我强烈建议在这种情况下避免使用它们,并且仅在需要时使用它们。

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 回答