2011-04-24 53 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;