C ++向量计数每个元素的出现

时间:2017-04-06 22:59:08

标签: c++ vector stl

我有一个 | 0 Math.floor ------+------+------------ 2.5 | 2 | 2 1.5 | 1 | 1 0.5 | 0 | 0 -0.5 | 0 | -1 -1.5 | =1 | -2 -2.5 | -2 | -3 类型的向量,我想知道这个向量中每个元素出现了多少次。

这个向量可能非常大,所以我想这个循环并不是一个好主意。

最有效的方法是什么?

2 个答案:

答案 0 :(得分:3)

除非矢量已经被排序(或至少分组,所以相同的元素都在一起),查看矢量中的每个项目是不可避免的(即使它被排序,除非你期望很多重复,否则很可能好的,看看每个项目都是首选的方法) 1

一个明显的方法是遍历向量,并使用std::unordered_map计算元素:

std::unordered_map<unsigned, size_t> counts;
for (auto v : your_vector)
    ++counts[v];

然后你可以(例如)打印出值:

for (auto const &p : counts)
    std::cout << "The value: " << p.first << " occurred " << p.second << "times\n";
  1. 如果您(期望)有大量重复项并且项目已订购,您可以使用二进制搜索来查找当前值的运行结束。理论上的收支平衡点是,如果给定值的平均重复次数等于整体大小的基数2对数,那么如果重复次数大于该值,则二进制搜索将需要较少的比较。现代CPU从可预测的线性访问模式中获得足够的收益,您可能需要基本上更多重复每个值(平均),以便二进制搜索成为胜利。

答案 1 :(得分:0)

您可以使用 std::count

使用简单:

std::count(vect.begin(), vect.end(), 3);