即使您已经有了一些好的答案,我还是决定发布另一个。我不确定它确实增加了很多新内容,但是我不确定它也不是。如果没有其他问题,我敢肯定,它使用的标准标头要比其他任何答案都要多。:-)
#include <vector>#include <algorithm>#include <unordered_map>#include <map>#include <iostream>#include <utility>#include <functional>#include <numeric>int main() { std::vector<int> inputs{ 1, 1, 1, 1, 2, 2, 2 }; std::unordered_map<int, size_t> counts; for (int i : inputs) ++counts[i]; std::multimap<size_t, int, std::greater<size_t> > inv; for (auto p : counts) inv.insert(std::make_pair(p.second, p.first)); auto e = inv.upper_bound(inv.begin()->first); double sum = std::accumulate(inv.begin(), e, 0.0, [](double a, std::pair<size_t, int> const &b) {return a + b.second; }); std::cout << sum / std::distance(inv.begin(), e);}与@Dietmar的答案相比,如果数字中有很多重复,这应该会更快,但是如果数字 大多是 唯一的,他的速度可能会更快。



