c++ - 使用 C/STL 计算出现次数并打印前 K 个

标签 c++ stl unordered-map

我有一个大文本文件,每行都有标记。我想计算每个标记出现的次数并对其进行排序。我如何在 C++ 中有效地做到这一点,最好使用内置函数和最短的编码(当然也是最有效的)?我知道如何在 python 中执行此操作,但不知道如何在 STL 中使用 unordered_map 执行此操作。

最佳答案

我会采用 unordered_map 方法。为了选择最频繁的 k 个标记,假设 k 小于标记总数,您应该看看 std::partial_sort .

顺便说一下,++frequency_map[token] (例如,频率_map 是 std::unordered_map<std::string, long> )在 C++ 中是完全可以接受的,尽管我认为 Python 中的等效项会在新看到的标记上爆炸。

好的,开始吧:

void most_frequent_k_tokens(istream& in, ostream& out, long k = 1) {
  using mapT = std::unordered_map<string, long>;
  using pairT = typename mapT::value_type;
  mapT freq;
  for (std::string token; in >> token; ) ++freq[token];
  std::vector<pairT*> tmp;
  for (auto& p : freq) tmp.push_back(&p);
  auto lim = tmp.begin() + std::min<long>(k, tmp.size());
  std::partial_sort(tmp.begin(), lim, tmp.end(),
      [](pairT* a, pairT* b)->bool {
        return a->second > b->second
               || (a->second == b->second && a->first < b->first);
        });
  for (auto it = tmp.begin(); it != lim; ++it)
    out << (*it)->second << ' ' << (*it)->first << std::endl;
}

关于c++ - 使用 C/STL 计算出现次数并打印前 K 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12737917/

相关文章:

C++ 动态数组大小定义

c++ - random_shuffle 线程安全吗?如果不是,则使用 rand_r

c++ - 以相反的顺序插入 vector

c++ - 基于 GLSL 的投影/模型 View 使对象不可见

c++ - 混合 MFC 和 STL

c++ - vector 中的删除方法

c++ - tbb::concurrent_unordered_multimap 中的错误?即使是单线程,条目也会丢失

c++ - std::unordered_map 如何释放使用 malloc 创建的结构。是否需要对 map 进行 2 次查询?

c++ - 如何按第一个 STL 列表的顺序对第二个 STL 列表进行排序

c++ - std::unordered_map operator[] 是否对不存在的键进行零初始化?