计算出现次数并使用C / STL打印顶部K.

时间:2012-10-05 00:29:17

标签: c++ stl unordered-map

我有一个大文本文件,每行都有令牌。我想计算每个令牌的出现次数并对其进行排序。我如何在C ++中有效地使用内置函数和最短编码(当然最有效)?我知道如何在python中完成它,但不知道如何在STL中使用unordered_map。

2 个答案:

答案 0 :(得分:3)

我会使用unordered_map方法。为了选择最常见的k代币,假设k小于代币总数,你应该看一下std::partial_sort

顺便说一下,++frequency_map[token](其中,frequency_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;
}

答案 1 :(得分:0)

假设您知道如何从C ++中读取文件中的行,这应该是朝着正确的方向推进

std::string token = "token read from file";
std::unordered_map<std::string,int> map_of_tokens;
map_of_tokens[token] = map_of_tokens[token] + 1;

然后你可以将它们打印出来(用于测试):

for ( auto i = map_of_tokens.begin(); i != map_of_tokens.end(); ++i ) {
    std::cout << i->first << " : " << i->second << "\n";
}