C++ 使用C/STL统计出现次数并打印top K
我有一个大的文本文件,每行都有标记。我想计算每个令牌的出现次数并对其进行排序。如何在C++中高效地使用内置函数和最短编码(当然,最有效)?我知道如何在Python中做它,但是不知道如何在STL使用unOrdEdMultI图。 < P>假设你知道如何从C++中读取文件的行,这应该是一个正确的方向: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;
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;
}