Сортировка карты по значениям, а не по ключам - PullRequest
0 голосов
/ 29 февраля 2012

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

2 голосов
/ 29 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...