В настоящее время я работаю над проектом, в котором мне приходится читать слово в слово текстовый файл и вставлять каждое слово в карту 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;
}