Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C/STL统计出现次数并打印top K_C++_Stl_Unordered Map - Fatal编程技术网

C++ 使用C/STL统计出现次数并打印top K

C++ 使用C/STL统计出现次数并打印top K,c++,stl,unordered-map,C++,Stl,Unordered Map,我有一个大的文本文件,每行都有标记。我想计算每个令牌的出现次数并对其进行排序。如何在C++中高效地使用内置函数和最短编码(当然,最有效)?我知道如何在Python中做它,但是不知道如何在STL使用unOrdEdMultI图。 < P>假设你知道如何从C++中读取文件的行,这应该是一个正确的方向: std::string token = "token read from file"; std::unordered_map<std::string,int> map_of_tokens;

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

< P>假设你知道如何从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;
std::string token=“从文件读取的令牌”;
std::无序的令牌映射;
令牌的映射单位[令牌]=令牌的映射单位[令牌]+1;
然后,您可以将它们打印出来(用于测试):

for(auto i=map_of_tokens.begin();i!=map_of_tokens.end();++i){

std::cout first我会使用无序映射方法。对于选择最频繁的k个令牌,假设k小于令牌总数,您应该看看

顺便说一下, +频率+映射[ToM] (其中频率映射为,例如,代码> STD::unOrdEdjPad < /COD>)在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;
}
void最频繁的令牌(istream&in,ostream&out,long k=1){
使用mapT=std::无序的\u映射;
使用pairT=typename mapT::value\u type;
mapT-freq;
对于(std::string token;in>>token;)++freq[token];
std::载体tmp;
对于(自动&p:freq)tmp,向后推(&p);
auto lim=tmp.begin()+std::min(k,tmp.size());
std::partial_sort(tmp.begin()、lim、tmp.end(),
[](pairT*a,pairT*b)->bool{
返回a->second>b->second
||(a->second==b->second&&a->firstfirst);
});
for(auto it=tmp.begin();it!=lim;++it)

第二个@ildjarn,正如我提到的,我能够使用无序映射计算令牌的出现次数。现在我想高效优雅地找到top K(我自己没有实现排序算法)。向我们展示您尝试过的代码。
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;
}