我需要对一组无符号整数列表中每个出现的值进行计数。例如,如果传递序列[3, 6, 9, 3, 9],我想要的结果是[{3, 2},{6, 1},{9, 2}]。
这些值是随机的32位无符号整数(范围为1到1,000,000,000)。结果可以存储在任何数据结构中(只要它们可以被线性迭代),并且虽然按值排序理想,但速度是次要关注点。
目前我有 -
T UniqueCount(std::vector<unsigned> &A)
{
std::unordered_map<unsigned,unsigned> value_counts;
for(unsigned val : A) {
value_counts[val]++;
}
A.clear();
...
}
分析表明,std::unordered_map比std::map更快。
有没有更好的方法?更快的方式?值得注意的是,由于使用情况(计数>4)可以记录为4。
目前这是一个瓶颈,虽然标准容器是首选,但如果性能提升超过额外的维护成本,则可以考虑使用自定义容器。
unsigned
不能保证能表示32位的值,因此在移植代码时可能存在正确性的潜在问题。 - PeterA
作为非 const 引用传递 - 是否允许修改?具体来说,是否允许对其进行排序? - ildjarn