2010-07-30 4 views
8

Comment les objets définis par l'utilisateur sont-ils triés dans la carte et définis? Pour autant que je sache, map/set sont des conteneurs associatifs triés: les éléments insérés sont triés en fonction de la clé qu'ils contiennent.Ordre de tri dans la carte STL et position

Mais la carte et définir en interne utilisent operator > pour trier leurs éléments.

À partir du site SGI, j'ai les exemples suivants:

struct ltstr 
{ 
    bool operator()(const char* s1, const char* s2) const 
    { 
     return strcmp(s1, s2) < 0; 
    } 
}; 

int main() 
{ 
    map<const char*, int, ltstr> months; 

    months["january"] = 31; 
    months["february"] = 28; 
    months["march"] = 31; 
    months["april"] = 30; 
    months["may"] = 31; 
    months["june"] = 30; 
    months["july"] = 31; 
    months["august"] = 31; 
    months["september"] = 30; 
    months["october"] = 31; 
    months["november"] = 30; 
    months["december"] = 31; 

    cout << "june -> " << months["june"] << endl; 

    map<const char*, int, ltstr>::iterator cur = months.find("june"); 
    map<const char*, int, ltstr>::iterator prev = cur; 
    map<const char*, int, ltstr>::iterator next = cur; 

    ++next; 
    --prev; 

    cout << "Previous (in alphabetical order) is " << (*prev).first << endl; 
    cout << "Next (in alphabetical order) is " << (*next).first << endl; 
} 

Dans l'exemple ci-dessus, comment sont les valeurs triées?

Modifier: Code déplacé de commentaire:

typedef map <string, int> Mint ; 

int main() 
{ 
    string Name ; 
    int Marks; 
    Mint Grade; 
    for (int i = 0; i<4; i++) 
    { 
     cin>> Name ; 
     cin >> Marks; 
     Grade [Name] = Marks ; 
    } 
    Mint :: iterator iter; 
    for(iter = Grade.begin(); iter != Grade.end(); iter++) 
     cout<< (*iter).first<<“ \t ” <<(*iter).second<<“\n” ; 
    return 0; 

} 

Comment les valeurs se organisait?

Répondre

8

std::map utilise un foncteur pour trier les éléments. Par défaut, c'est std::less<Key> qui utilise operator<. Dans votre exemple, il existe un foncteur défini par l'utilisateur ltstr qui vous aidera à trier les éléments en fonction de leurs clés dans l'ordre alphabétique.

+0

Donc, fondamentalement map utilise une clé pour trier les valeurs basées sur std :: less qui utilise l'opérateur ronan

+1

Oui, il utilise 'operator <' à la fin si vous n'avez pas explicitement spécifié l'argument template. –

+0

@Kirill Il utilise le comparateur pour comparer les clés et non les éléments. – DumbCoder

3

Tout d'abord operator< est utilisé par défaut et non operator>. Dans votre cas, vous passez une fonction de comparaison personnalisée en transmettant le troisième paramètre de modèle lors de la création de l'objet carte. Lors de l'insertion de chaque élément dans la carte, ce foncteur de comparaison est utilisé pour déterminer l'ordre relatif de l'objet dans la carte, c'est-à-dire qu'il est utilisé pour comparer les clés. Par exemple, lorsque vous faites months["february"] = 28;, la carte compare les clés "janvier" et "février". Comme nous faisons une comparaison de chaînes, cette comparaison renvoie une valeur supérieure à 0. Cette valeur est utilisée pour déterminer la position de la clé "février" par rapport à "janvier".