Wygląda na to, że mogę posortować std :: vector < std :: pair < int, std :: string > >, a zostanie posortowane na podstawie wartości int. Czy jest to dobrze określone zadanie? Czy std :: pair ma domyślną kolejność na podstawie jej elementów?Czy std :: pair <int, std :: string> porządek jest dobrze zdefiniowany?
Odpowiedz
std::pair
używa porównania leksykograficznego: Będzie porównywać na podstawie pierwszego elementu. Jeśli wartości pierwszych elementów są równe, wówczas będzie porównywać się na podstawie drugiego elementu.
Definicja w standardzie C++, 03 (sekcja 20.2.2) wynosi:
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).
Operator porównania. Używa porównania leksykograficznego: wartość zwracana jest prawdą, jeśli pierwszy element x jest mniejszy niż pierwszy element y, i fałsz, jeśli pierwszy element y jest mniejszy niż pierwszy element x. Jeśli żadna z nich nie ma miejsca, operator < zwraca wynik porównania drugich elementów xiy. Ten operator może być używany tylko wtedy, gdy zarówno T1, jak i T2 są LessThanComparable. Jest to funkcja globalna, a nie funkcja składowa.
Wygląda na to, że jest to połączenie obu tych elementów.
Według mojej kopii standardu C++ 0x, sekcji 20.3.3.26, std::pair
ma operator<
zdefiniowane tak, że dla dwóch par x i y, zwraca
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
Nie jestem pewien, czy to także część standardu z 2003 roku. Powinienem również zauważyć, że nie skompiluje się, jeśli same elementy nie są mniej porównywalne.
Tak. operator<()
jest zdefiniowany dla std::pair<T1, T2>
, przy założeniu, że zarówno T1
, jak i T2
są porównywalne.
- 1. Umieszczanie std :: pair
- 2. znaleźć w std :: wektor <std::pair>
- 3. Czy ten kod jest dobrze zdefiniowany?
- 4. Sortowanie std :: wektor <std :: pair <std :: string, bool >> według ciągu znaków?
- 5. Jak przekonwertować posortowane std :: lista std :: pair na std :: map
- 6. Jak zainicjować const std :: pair?
- 7. Czy istnieje różnica między std :: map <int, int> a std :: map <const int, int>?
- 8. 'struct std :: pair <int, int>' nie ma członka o nazwie "serialize"
- 9. std :: pair <int, int> vs struct z dwoma intami
- 10. Dlaczego std :: sub_match <T> publicznie dziedziczy ze std :: pair <T, T>?
- 11. emplace_back nie działa z std :: wektor <std :: map <int, int>>
- 12. Dlaczego "is_convertible" tutaj w <utility> std :: pair (STL)?
- 13. Przypisywanie std :: function <int(int)> do std :: function <const int i (const int & x)>
- 14. Jest ++ atomowy dla std :: atomowy <int>
- 15. I która sytuacja będzie std :: map <A,B> będzie szybsza niż posortowana std :: vector <std :: pair <A,B>>?
- 16. Jak znaleźć największy int w std :: set <int>?
- 17. Dlaczego std :: result_of <int(int)> :: type valid?
- 18. Prawidłowy sposób przeniesienia własności std :: vector <std :: unique_ptr < int>> na konstruowaną klasę
- 19. Czy RVO stanie się po powrocie std :: pair?
- 20. std :: make_shared z std :: initializer_list
- 21. std :: wektor <std::string> crash
- 22. C++ std :: map <std :: string, int> uzyskać wartości, których klucz zaczyna się od określonego ciągu znaków
- 23. Jak mogę wydrukować wartość std :: atomowej <unsigned int>
- 24. std :: mapowanie <string,int> domyślna inicjalizacja wartości
- 25. Konwersja std :: wstring na int
- 26. para <int,int> pary jako klucz unordered_map emisji
- 27. Cython std :: pair z dwoma wskaźnikami, oczekuje identyfikator lub dosłownego
- 28. Jak obliczyć sumę wartości w std :: vector <int>
- 29. std :: vector: nie można wiązać 'std :: ostream aka {std :: basic_ostream <char>}' lwartość do 'std :: basic_ostream <char> &&'
- 30. konwersja int na std :: string