2016-09-24 1 views
0

J'essaie de trier ma carte non ordonnée en utilisant les valeurs.Trier la fonction cmp sur une carte non ordonnée

C'est le code que j'ai:

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <unordered_map> 

using namespace std; 

bool cmp(pair<char,int> &left, pair<char,int> &right){ 
    cout<<"Inside comp function"<<endl; 
    return left.second < right.second; 
} 

int main(){ 
    int len; 
    unordered_map<char,int> charCount; 
    cin >> len; 
    string s,t; 
    cin >> s; 
    for(int i=0;i<s.length();i++){ 
     if(charCount.find(s[i]) != charCount.end()){ 
      charCount[s[i]]++; 
     }else{ 
      charCount.insert(make_pair<char&,int>(s[i],1)); 
     } 
    } 
    sort(charCount.begin(),charCount.end(),cmp); 
    for(auto& it:charCount){ 
     cout <<it.first<<" -> "<<it.second<<endl; 
    } 
    cout<<endl; 
    return 0; 
} 

C'est l'erreur que je reçois:

In file included from /usr/include/c++/4.9/algorithm:62:0, 
       from solution.cc:21: 
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::__detail::_Node_iterator<std::pair<const char, int>, false, false>; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(std::pair<char, int>&, std::pair<char, int>&)>]': 
/usr/include/c++/4.9/bits/stl_algo.h:4717:78: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = std::__detail::_Node_iterator<std::pair<const char, int>, false, false>; _Compare = bool (*)(std::pair<char, int>&, std::pair<char, int>&)]' 
solution.cc:58:49: required from here 
/usr/include/c++/4.9/bits/stl_algo.h:1968:22: error: no match for 'operator-' (operand types are 'std::__detail::_Node_iterator<std::pair<const char, int>, false, false>' and 'std::__detail::_Node_iterator<std::pair<const char, int>, false, false>') 
    std::__lg(__last - __first) * 2, 
        ^
/usr/include/c++/4.9/bits/stl_algo.h:1968:22: note: candidates are: 
In file included from /usr/include/c++/4.9/bits/stl_algobase.h:67:0, 
       from /usr/include/c++/4.9/bits/stl_tree.h:61, 
       from /usr/include/c++/4.9/map:60, 
       from solution.cc:1: 
/usr/include/c++/4.9/bits/stl_iterator.h:328:5: note: template<class _Iterator> typename std::reverse_iterator<_Iterator>::difference_type std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&) 
    operator-(const reverse_iterator<_Iterator>& __x, 
    ^

Quelqu'un peut-il s'il vous plaît me guider la façon de corriger la fonction de comparaison? Je vais prendre mon poste si quelqu'un pense que ce n'est pas le bon forum pour poser cette question. Merci et attendons avec impatience votre aide !!!

+0

'bool cmp (const paire & gauche, const paire & right) {'très probablement. –

+0

@ πάνταῥεῖ Ce n'est pas ça - il essaie de trier une carte non ordonnée. – dasblinkenlight

+1

@dasblinkenlight Je vois. –

Répondre

4

La carte non ordonnée est ce que son nom implique - c'est, bien, non ordonnée. Vous ne pouvez pas le faire commander à cause de cela. Malheureusement, le message est trop énigmatique pour expliquer ce qui se passe. Fondamentalement, C++ se plaint d'une propriété de l'itérateur de carte requise pour le tri, qui n'est pas là sur les itérateurs de conteneurs non ordonnés.

Si vous voulez faire un récipient commandé avec les données de carte non ordonnée, vous devez copier les données dans quelque chose que vous pouvez commander, comme un vecteur ou un tableau:

vector<pair<char,int>> orderedCounts(charCount.begin(),charCount.end()); 
sort(orderedCounts.begin(), orderedCounts.end(), cmp);