无序地图如何工作

时间:2015-05-31 18:21:11

标签: c++

我有一个程序可以计算文件中的单词并写入文件。一切都是通过有序地图完成的。应该命令它重写地图,并按字数排序(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。对不起,我无法使用有序地图

2 个答案:

答案 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;
}