如何创建矢量<vector <long>&gt;的直方图?

时间:2015-06-23 03:21:44

标签: c++ c++11

我已分配vector<vector<long>>。在没有重定位数据的情况下,创建直方图或在所有向量上使用std :: find的正确方法是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

通过直方图,我理解一个地图值 - &gt;出现,并且你的数据意味着map<int, int>,我不明白std :: find是如何开始的。说这个我会这样做:

// assuming exists vector<vector<long<long>>
std::map<long, int> histogram ;
for (const auto &v1 : vect)
    for (auto value : v1)
    {
        auto it = histogram.find(value) ;
        if (it == histogram.end())
             histogram[value] = 1 ;
        else
            it->second++ ;
    }

答案 1 :(得分:0)

根据评论,您需要的是一种方法来收集您在运行时收集的向量中的所有值,并跟踪每个值中有多少值。幸运的是,有几种标准算法和容器可以有效地处理这项任务。

std::unordered_map<long,unsigned int> histogram;
std::for_each(data.begin(), data.end(), [&histogram=histogram](std::vector<long>& inner_vec)
     {
          for(long val : inner_vec)
          {
            ++histogram[val];   
          }
     });

您确实提到过您正在处理的矢量数量可能很大。这个问题可能很容易让自己适应多线程解决方案。

初始尝试可能是让每个线程都有自己的std::unordered_map<long,unsigned int>并跟踪较大数据集的子集的计数,然后在所有线程完成时将结果合并回更大的histogram

这里是live demo,展示了上述每种方法。您应该使用优化设置编译所有这些,以真正了解这对您来说有多快,并测量多线程解决方案是否能带来好处。