使用向量向量中的计数仅返回唯一元素的最佳方法是什么?
std::vector<std::vector<string>> vec_vec{{a,a,b,c},{a,c,c}};
结果应该是:
{a, b, c} // This is the vector that contains the unique items.
{3, 1, 3} //a exists three times, b only one time, and c is three times.
要解决此问题,我使用以下内容:
1-将向量向量中的所有项目复制到单个向量,因此输出将为:
vec_vec{{a,a,b,c},{a,c,c}} -> vec{a,a,b,c,a,c,c}
2-现在我处理单个向量(不是向量的向量),因此它更容易排序,获取唯一项目和它们(我可以使用代码{{3} }和here1)
将矢量矢量转换为一个矢量是一个好主意吗?有更好的解决方案吗?
与当前的方式(c ++ 11,c ++ 14)相比,我们能找到更好的方法,而且复杂度更低吗?
答案 0 :(得分:1)
从头脑中:
std::unordered_map<std::string, std::size_t> counters;
for(auto const& inner : vec_vec)
for(auto const& v : inner)
counters[v]++;
for(auto const& cnt : counters)
std::cout << cnt.first << " appears " << cnt.second << std::endl;
答案 1 :(得分:1)
使用哈希地图。
std::unordered_map<string, int> result;
for (const auto& x : vec_vec)
for (const string& y : x)
result[y]++;
答案 2 :(得分:1)
我只想使用map
作为“理货”结构:
std::map<string, unsigned int> tally;
for(auto subvector : vector) { // subvector is std::vector<std::string>
for(auto item : subvector) { // item is a std::string
++tally[item];
}
}
如果您坚持将结果作为两个平行向量(但为什么会这样?),只需从地图构建它们:
std::vector<std::string> unique_items;
unique_items.reserve(tally.size());
std::vector<unsigned int> counts;
counts.reserve(tally.size());
for(auto item : tally) {
unique_items.push_back(item.first);
counts.push_back(item.second);
}
如果您不希望对结果向量进行排序,则可以使用unordered_map
,如其他答案所示。