所以,我正在尝试计算数组的元素。我的意思是,我有一个大数组,每个元素在整个数组中都有多个。我试图找出每个元素出现的次数,但是我一直遇到有重复的问题。由于“x”可能存在于数组中的12个不同位置,当我循环并保持运行总和时,我得到“x”12次不同的计数。有没有人知道一个更简单/更好的方法来保持一个没有重复的数组的计数?
我的代码是:
其中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 :(得分:2)
std::map<X, unsigned> tally;
for(i = 0; i < count; ++i)
++tally[array[i]];
请注意,如果阵列中的冗余相当高,则最好。如果大多数项目都是唯一的,那么你可能更好的只是按照其他人提到的那样对数组进行排序。
答案 1 :(得分:0)
如果您可以对数组进行排序,只需对其进行排序即可。然后你剩下的就是元素的线性扫描,检查这个元素后面的元素是否与当前元素相同(不要忘记边界检查)。
答案 2 :(得分: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";
}
}
警告:这是未经测试的代码。
答案 3 :(得分: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;