2011-04-24 86 views
0

所以,我試圖計算一個數組的元素。我的意思是,我有一個大型數組,每個元素在整個數組中都有多個。我試圖找出每個元素出現的次數,但是我一直遇到存在重複記錄的問題。因爲「x」可能存在於陣列中的12個不​​同位置,所以當我循環並保持運行總和時,我得到12個不同時間的「x」的計數。有沒有人知道更簡單/更好的方法來保持陣列沒有重複的記錄?計數陣列中的元素

我的代碼是:

其中count是元素

for(i=0;i<count;i++) 
    { 


      for(x=0; x<count;x++) 
      { 
        if(array[i]==array[x]) 
        { 
          tallyz++; 
        } 

      } 

        tally[i]=tallyz-1; 
        tallyz=0; 
        } 

    } 
+0

爲什麼不乾脆擺脫tallyz'的'和'正好相符[I] +'? – corsiKa 2011-04-24 02:24:09

回答

0

如果你能數組排序的號碼,只需排序。然後,你剩下的就是對元素進行線性掃描,檢查這個元素背後的元素是否與當前元素相同(不要忘記邊界檢查)。

+0

如果您無法對數組進行排序,請複製它並對副本進行排序。 – 2011-04-24 02:15:06

+0

我忘記提及的唯一問題是,數組「陣列」必須與計數陣列平行,以便保持該元素的計數。所以,如果我只是對tally數組進行排序,而不是將其與其他數組中的元素相對應。還是你的意思是別的? – Sam 2011-04-24 02:18:04

+0

如果是這種情況,請使用對。將int設置爲原始數組中項目的整數座標。然後根據第一個數據類型對該對進行排序。這樣你保留你的原始位置 – 2011-04-24 02:28:21

1
std::map<X, unsigned> tally; 

for(i = 0; i < count; ++i) 
    ++tally[array[i]]; 

請注意,如果陣列中的冗餘度相當高,則最好。如果大多數項目都是獨一無二的,那麼您可能更好的是按照其他人的說法對數組進行排序

+0

這樣保持與「陣列」數組相對應的計數陣列?如果不清楚,「數組」是字符串類型,並代表我保持計數的某些內容,所以我不能只對它們進行排序,因爲它會拋棄它們所連接的內容。 – Sam 2011-04-24 02:25:04

+0

@Sam - 使用地圖確保沒有重複。這是至少** **的要求。 – 2011-04-24 05:51:47

0

作爲一種替代的排序,你可以使用地圖:

template<class T, size_t N> 
void printSums(T (array&)[N]) { 
    map<T, size_t> m; 
    for(T*p = array; p < array+N; ++p) { 
    ++m[*p]; 
    } 
    for(map<T,size_t>::iterator it = m.begin(); it != m.end(); ++it) { 
    cout << it->first << ": " << it->second << "\n"; 
    } 
} 

警告:這是未經測試的代碼。

0

第一次使用的地圖,就像約翰說,然後遍歷計數陣列:


std::map<X, unsigned> data; 

for(i = 0; i < count; i++) 
    data[array[i]]++; 

for(i = 0; i < count; i++) 
    tally[i]=data[tally[i]]-1;