2012-08-13 64 views
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 
      } 
     } 
} 
+0

自从您提及_assignment_以来,我已添加了作业标记。 – pb2q 2012-08-13 18:58:01

+0

你的想法看起来不错。你试过了吗? – KRyan 2012-08-13 18:58:08

+0

为OP添加了作业标签提到这是一个“作业”。 – 2012-08-13 18:59:00

回答

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上的下一个可用位置,然后增加下一个值。

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

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); 
     } 
    } 
} 
+0

这具有'O(n^2)'复杂度,而不是'O(n log n)',可以通过对两个范围进行排序并执行'set_intersection'来获得。 – TemplateRex 2012-08-13 19:11:43

+0

好吧,这似乎很合理,但你能看到我用指针重新编辑。我如何重新加入你刚添加的指针? – tensuka 2012-08-13 19:12:12

+0

@rhalbersma我同意,但这并不像他需要最好的代码那样,他需要了解数组以及如何使用它们。 – Topo 2012-08-13 19:14:00

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; 
} 
+0

不允许真正使用STL。这是介绍C++的东西。然而,第三个数组被提到是一维和空的 – tensuka 2012-08-13 19:02:39

+0

使用5作为幻数是一种不好的做法。使用'#DEFINE'是合理的。 – KRyan 2012-08-13 19:02:59

+0

我被允许使用指针 – tensuka 2012-08-13 19:03:08