L'Ordre de tri dans la STL carte et définir
Comment sont définis par l'utilisateur objets triés sur la carte et définir?
Autant que je sache, de la carte/set sont Triés Conteneurs Associatifs: les éléments insérés sont classées sur la base de la clé qu'il détient.
Mais la carte et définir les utiliser à l'interne operator >
pour le tri de leurs éléments.
De la SGI site, 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 les valeurs sont triées?
Edit: 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 rentrer dans l'ordre?
OriginalL'auteur ronan | 2010-07-30
Vous devez vous connecter pour publier un commentaire.
std::map
utilise un foncteur pour trier les éléments. Par défaut, est-ilstd::less<Key>
qui utiliseoperator<
. Dans votre exemple il y a un définis par l'utilisateur foncteurltstr
qui aidera à trier les éléments en fonction de ses touches dans l'ordre alphabétique.Oui, il utilise
operator<
à la fin si vous n'avez pas précisé argument de modèle explicite.Il utilise la comparaison pour comparer les touches pas les éléments.
les éléments sont considérés comme triés en fonction de ces touches.
Code copié à partir d'un commentaire dans la question! Mais le code ne soit trié par std::less<std::string> qui utilise l'opérateur< qui est défini dans std::string pour donner un lexicographiquement moins de chaîne (c'est à dire le même que vous l'expérience lors de l'utilisation de char* et ltstr)
OriginalL'auteur Kirill V. Lyadvinsky
Tout d'abord
operator<
est utilisé par défaut et de ne pasoperator>
. Dans votre cas, vous êtes de passage à une comparaison personnalisée de la fonction en passant par le troisième paramètre de modèle lors de la création de l'objet map. Lors de l'insertion de chaque élément de la carte, cette comparaison foncteur 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 faitesmonths["february"] = 28;
, carte compare les touches "janvier" et "février". Puisque nous faisons une comparaison de chaîne, cette comparaison renvoie une valeur supérieure à 0. Cette valeur est utilisée pour déterminer la position de la touche "février" en ce qui concerne les "janvier".OriginalL'auteur Naveen