我已分配vector<vector<long>>
。在没有重定位数据的情况下,创建直方图或在所有向量上使用std :: find的正确方法是什么?
谢谢
答案 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,展示了上述每种方法。您应该使用优化设置编译所有这些,以真正了解这对您来说有多快,并测量多线程解决方案是否能带来好处。