计算数组中的元素

时间:2011-04-24 02:08:23

标签: c++ arrays

所以,我正在尝试计算数组的元素。我的意思是,我有一个大数组,每个元素在整个数组中都有多个。我试图找出每个元素出现的次数,但是我一直遇到有重复的问题。由于“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;
                    }

    }

4 个答案:

答案 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;