2012-02-29 2 views
0

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

Пожалуйста, проверьте [этот ответ] (http://stackoverflow.com/questions/2699060/stl-map-sort-by-value). – dasblinkenlight

+0

Возможный дубликат [Сортировка std :: map по значению перед выходом и уничтожением] (http://stackoverflow.com/questions/1367429/sorting-a-stdmap-by-value-before-output-destroy) –

ответ

2

Создать вектор std::pair<int,string> и заполнить его с содержимым карты, а затем отсортировать.

У Boost есть некоторые способы создания карты, которая может быть пройдена по ключу или значению, но я думаю, что это перебор в этом случае.

Смежные вопросы