2017-05-04 7 views
-1

J'utilise la chaîne comme valeur de clé dans la carte et en essayant de personnaliser la fonction de comparaison. Lorsque j'ai personnalisé la fonction de comparaison en comparant la longueur des chaînes, la carte ne parvient pas à indiquer les différentes chaînes de même taille. Le code est aussi suivi:chaîne comme clé dans la carte, personnalisé la fonction de comparaison

class Solution { 
public: 
int findLUSlength(vector<string>& strs) { 
    if(strs.size() < 2) return -1; 
    auto cmpByStringLength = [](const string &s1, const string &s2)->bool 
         { 
          return s1.size() < s2.size(); 
         }; 
    map<string, int, decltype(cmpByStringLength)> mpstringcount(cmpByStringLength); 
    for(int i = 0; i < strs.size(); i++) 
     mpstringcount[strs[i]]++; 
    for(auto itmp = mpstringcount.begin(); itmp != mpstringcount.end(); itmp++) 
    { 
     cout << "itmp->first: " << itmp->first << endl; 
    } 
    return -1; 
} 
}; 

Si mes strs d'entrée est ["aba","cdc","eae","abcd"], le code juste sortie: "abcd" et "aba".

+1

Comprendre "ceci"? Comprendre quoi? –

Répondre

2

La carte ne parvient pas à indiquer les différentes chaînes de même taille.

Notez que le comparateur fourni à std::map n'est pas seulement utilisé pour la commande, mais aussi pour la vérification de l'égalité.

Partout la bibliothèque standard utilise le concept Compare, l'unicité est déterminée en utilisant la relation d'équivalence. En termes imprécis, deux objets a et b sont considérés comme équivalents (non uniques) si ni se compare moins que l'autre: !comp(a, b) && !comp(b, a).

Et std::map stocke les éléments avec une clé unique. Votre comparateur compare string s en fonction de leur longueur, alors pour ces string s de même longueur, seul l'un d'entre eux sera mémorisé. Du point de vue d'un map<string, int, decltype(cmpByStringLength)>, "aba", "cdc", "eae" sont les mêmes string s.

+0

Ah, j'ai mal compris l'utilisation de la fonction de comparaison. Je pensais qu'il utilisait simplement la fonction de comparaison pour décider de l'ordre des valeurs clés. J'ai relu la fonction de comparaison: http://www.cplusplus.com/reference/map/map/ Donc à partir de p2, la fonction est également utilisée pour décider si les deux éléments sont égaux. Merci beaucoup. –

+0

@JianSun Oui, il utilise le comparateur non seulement pour commander, mais aussi pour vérifier l'égalité. S'il utilise quelque chose d'autre corrigé pour l'égalité, comme 'operator ==', et 'std :: map' ne fournit pas la méthode pour le spécifier, il sera impossible de le personnaliser. – songyuanyao