如果您愿意使用 Boost,则可以使用Boost::Bimap,它可以让您将单词与计数相关联,并将计数与单词(同时)相关联。此示例说明如何计算文本的字数并显示直方图。
如果您只需要偶尔显示排序后的字数,使用正则std::map
来构建字数图可能会更快。然后,您可以使用其他答案中显示的技术根据需要生成排序的字数。您可能必须运行基准测试才能知道哪个更快。
为了完整起见,我将添加另一个使用堆排序的解决方案,方法是将映射对推送到 astd::priority_queue
以获得按出现排序的字数:
#include <iostream>
#include <map>
#include <queue>
typedef std::map<std::string, int> MyMap;
struct OrderByOccurence
{
bool operator()(MyMap::const_reference lhs, MyMap::const_reference rhs)
{
// This will make the priority queue sort from highest word count
// to lowest.
return lhs.second < rhs.second;
// This will make the priority queue sort from lowest word count
// to highest.
// return rhs.second < lhs.second;
// Here, you can also check that if both counts are the same,
// the elements should be ordered alphabetically by word.
}
};
int main()
{
MyMap m = {{"a", 1}, {"b", 2}, {"c", 3}};
std::priority_queue<std::pair<std::string, int>,
std::vector< std::pair<std::string, int> >,
OrderByOccurence> q;
for (auto it=m.begin(); it!=m.end(); ++it)
q.push(*it);
while (!q.empty())
{
std::cout << q.top().first << " " << q.top().second << "\n";
q.pop();
}
}