得到传染媒介明显传染媒介与计数

时间:2015-11-27 13:34:41

标签: c++ algorithm c++11 vector c++14

使用向量向量中的计数仅返回唯一元素的最佳方法是什么?

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)相比,我们能找到更好的方法,而且复杂度更低吗?

3 个答案:

答案 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,如其他答案所示。