Il semble que je peux trier un std :: vecteur < std :: paire < int, std :: string > >, et il triera en fonction de la valeur int. Est-ce une chose bien définie à faire? Est-ce que std :: pair a un ordre par défaut basé sur ses éléments?Est-ce que std :: pair <int, std :: string> est bien défini?
Répondre
std::pair
utilise la comparaison lexicographique: Il sera basé sur le premier élément. Si les valeurs des premiers éléments sont égales, elles seront ensuite comparées en fonction du second élément.
La définition de la norme 03 C++ (section 20.2.2) est:
template <class T1, class T2>
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);
Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).
L'opérateur de comparaison. Il utilise la comparaison lexicographique: la valeur de retour est vraie si le premier élément de x est inférieur au premier élément de y, et faux si le premier élément de y est inférieur au premier élément de x. Si ce n'est pas le cas, l'opérateur < renvoie le résultat de la comparaison des deuxièmes éléments de x et y. Cet opérateur ne peut être utilisé que si T1 et T2 sont LessThanComparable. Ceci est une fonction globale, pas une fonction membre.
On dirait que c'est en fait une combinaison des deux éléments.
Selon ma copie de la norme C++ 0x, section 20.3.3.26, std::pair
a un operator<
défini tel que pour deux paires x et y, il retourne
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
Je ne suis pas certain si cela fait également partie de la norme de 2003. Je devrais également noter que ceci ne compilera pas si les éléments eux-mêmes ne sont pas LessThanComparable.
Oui. operator<()
est défini pour std::pair<T1, T2>
, en supposant que les deux T1
et T2
sont eux-mêmes comparables.
- 1. C++ std :: pair, std :: vecteur & memcopy
- 2. __gnu_cxx Carte de hachage avec les clés de type std :: pair <std :: string, unsigned int>?
- 3. std :: map <tstring <std :: carte <tstring, unsigned int >> affectation échoue
- 4. "Constante forcée" dans std :: map <std :: vector <int>, double>>?
- 5. std :: trier sur std :: vector <std::string>
- 6. Quelle doit être la taille d'une collection pour std :: map <k,v> pour surpasser un std :: vector <std :: pair <k,v>>?
- 7. `auto-increment` std :: map <string, int> :)
- 8. Aucune correspondance pour l'appel à '(std :: paire <unsigned int, unsigned int>) (entier non signé &, unsigned int)'
- 9. Comment insérer une paire de std :: pair dans une autre paire std ::?
- 10. C++ problème avec std :: pair et déclarations avant
- 11. comportement bizarre avec std :: getline et std :: vecteur <std::string>
- 12. copier depuis un std :: istreambuf_iterator <> vers un std :: vector <>
- 13. std :: back_inserter pour un ensemble std ::?
- 14. std :: bugs stringstream?
- 15. std :: make_heap avec des paires
- 16. Comment puis-je trouver le plus grand int dans un ensemble std :: <int>?
- 17. Pourquoi std :: vector :: operator [] est 5 à 10 fois plus rapide que std :: vector :: at()?
- 18. Est-il possible de "consolider" un champ de "std :: pair" sans hacks?
- 19. std :: vecteur de std :: fonction
- 20. Segmentation fault en fonction std std :: _ Rb_tree_rebalance_for_erase()
- 21. problème avec std :: multimap
- 22. problème avec std :: avance sur std :: ensembles
- 23. Comment convertir un vecteur <pair <int,int>> en multimap <int,int> efficacement?
- 24. Est-ce que `std :: string (strerror (errno))` est dangereux?
- 25. Est-ce que lancer à un int après std :: floor garantit le bon résultat?
- 26. Qu'est-ce que std :: safe_string?
- 27. Comment trier std :: Liste <..>
- 28. std :: list <> :: sort est-il stable?
- 29. boost :: rogne chaque chaîne dans std :: vector <std::string>
- 30. Iterate std :: list <boost :: variant>