2012-08-13 90 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