按值而不是键对地图进行排序

时间:2012-02-29 04:01:25

标签: c++ map

我目前正在开展一个项目,我必须逐字阅读文本文件并将每个单词插入到STL地图中,其中键是单词,值是单词出现的次数。问题的这一部分对我来说很有意义(我用每个单词填充一个向量,然后遍历向量并将每个单词插入到地图中,并且取决于它是否已经在地图中插入它)。

问题的下一部分然后要求我按顺序打印出直方图,按字数排序。如果你看看我下面的代码,我使用的是sMap.begin()和sMap.end()(我知道sMap.rbegin和rend会给出与列表相反的内容)。地图当前正在对我的键值进行排序。是否有一种简单的方法可以强制我的地图按值排序,还是我必须进行某种类型的地图复制?

        int main(){
          using namespace std;
          char* filename = "dracula.txt";
          ifstream in(filename);
          vector<string> contents;
          string tempWord;
          map<string, int> sMap;

          while(in>>tempWord)
            contents.push_back(tempWord);
          // now we have a vector with every word
          int i =0;
          for(i;i<contents.size();i++){
            // insert into the STL Map
            map<string,int>::iterator it = sMap.find(contents[i]);
            if(it==sMap.end()){
              // we just need to insert the element with an occurence of 1
              sMap.insert(map<string,int>::value_type(contents[i],1));  
            }else{
              int temp = it->second;
              sMap.erase (it);
              sMap.insert(map<string,int>::value_type(contents[i],temp+1));
            }
          }
          // now we have a filled map with all the words in the file
          // we just need to sort the map based on the occurences
          map<string,int>::iterator rit;
          for(rit=sMap.begin(); rit != sMap.end();rit++){
            cout << rit->first << ": ";
            for(int q = rit->second; q>0; q--){
              cout << "|";
            }
            cout << endl;
          }
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:2)

创建一个std::pair<int,string>的向量,并用地图的内容填充它,然后排序。

Boost有一些创建可以通过键或值遍历的地图的方法,但我认为在这种情况下这样做太过分了。