我在每一行中都有一個帶有標記的大文本文件。我想計算每個令牌的出現次數並對其進行排序。如何在C++中高效地使用內置函數和最短編碼(當然最有效)?我知道如何在python中做到這一點,但不知道如何在STL中使用unordered_map來做到這一點。使用C/STL計算出現次數並打印頂部K
2
A
回答
3
我會採用unordered_map方法。爲了選擇最頻繁的k令牌,假設k小於令牌的總數,你應該看看std::partial_sort。
順便說一句,++frequency_map[token]
(其中frequency_map是,比如std::unordered_map<std::string, long>
)在C++中是完全可以接受的,但我認爲Python中的等價物會炸燬新觀察到的標記。
OK,在這裏你去:
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;
}
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";
}
相關問題
- 1. 計算短語和打印的出現次數
- 2. 打印並計算排列次數(不使用stl next_permutation)
- 3. 多次重複單次計算並打印出結果? (MonadRandom)
- 4. 使用Multiset來計算出現次數
- 5. 打開一個文件並計算出現'|||'的次數
- 6. 計算字符的出現並將其打印出來
- 7. 計算總和,多個頂部的K值的計數火花
- 8. 計算出現次數
- 9. 計算出現次數
- 10. 計算出現次數
- 11. 計算距離並打印出來
- 12. 計算行發生次數並將它們打印
- 13. 如何打印出現次數
- 14. 打印在頂部
- 15. 計算數組中出現的次數
- 16. 動態計算頂部數
- 17. 如何計算單詞在句子中出現的次數並打印出索引? (Python)
- 18. SQL - 計數數據類型並首先打印最高出現
- 19. 依次計算圖中k個頂點的所有派系
- 20. 如何計算和打印一次?
- 21. 如何通過計算值的出現次數並將其打印在該值旁邊來創建新數組?
- 22. 計算每行字符出現次數
- 23. 計算每次出現的隨機數
- 24. 計算幾列中的出現次數
- 25. 如何計算出現次數
- 26. 計算表中的出現次數
- 27. MapReduce來計算對的出現次數
- 28. SQL:計算唯一出現次數?
- 29. 計算出現值的次數
- 30. 計算表中出現次數
@ildjarn正如我所說,我能夠指望使用unordered_map標記的出現。現在我想要高效而優雅地找到頂級K(我自己實現排序算法的時間很短)。 – ElKamina
向我們展示您嘗試過的_code_。 – ildjarn