我目前正在开展一个项目,我必须逐字阅读文本文件并将每个单词插入到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;
}
答案 0 :(得分:2)
创建一个std::pair<int,string>
的向量,并用地图的内容填充它,然后排序。
Boost有一些创建可以通过键或值遍历的地图的方法,但我认为在这种情况下这样做太过分了。