我有一个程序可以计算文件中的单词并写入文件。一切都是通过有序地图完成的。应该命令它重写地图,并按字数排序(Int) 我的节目:
#include <iostream>
#include <string>
#include <map>
#include <fstream>
using namespace std;
int main()
{
map <string, int> words;
ifstream in;
in.open("in.txt");
string word;
while (in >> word)
words[word]++;
ofstream out;
out.open("out.txt");
int count = 0;
map <string, int>::iterator cur;
out << "Words count:" << endl;
for (cur = words.begin(); cur != words.end(); cur++)
{
out << (*cur).first << ": " << (*cur).second << endl; count += (*cur).second;
}
return 0;
}
P.S。对不起,我无法使用有序地图
答案 0 :(得分:0)
执行此操作的最常用方法是反转对,将它们推到矢量上并使用带有比较功能的std::sort
。但是多个键可以具有相同的值。因此,排序列表(翻转)实际上是一个多图 - 一个可以有多个具有相同值的键的地图。
建议的解决方案是here。
答案 1 :(得分:0)
std::map
中的元素实际上是std::pair
。我们将iterator
指向std::vector
中的对,并通过提供自定义比较函数对迭代器进行排序。
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
typedef map<string,int>::iterator Iter;
bool compare(Iter lhs, Iter rhs) {
return lhs->second < rhs->second
|| (lhs->second == rhs->second && lhs->first < rhs->first);
}
int main()
{
map <string, int> words;
ifstream in;
in.open("in.txt");
string word;
while (in >> word)
words[word]++;
ofstream out;
out.open("out.txt");
int count = 0;
map <string, int>::iterator cur;
out << "Words count:" << endl;
vector<Iter> v;
for (cur = words.begin(); cur != words.end(); cur++)
{
// out << (*cur).first << ": " << (*cur).second << endl; count += (*cur).second;
v.push_back(cur);
}
sort(v.begin(), v.end(), compare);
for (int i = 0; i < v.size(); ++i) {
out << v[i]->first << ": " << v[i]->second << endl; count += v[i]->second;
}
return 0;
}