检查数组是否有类似元素并转移到新数组

时间:2012-08-13 18:56:49

标签: c++ visual-c++

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);
        }
    }
}