std:: lexicographical_compare_three_way
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
InputIt1,
class
InputIt2,
class
Cmp
>
constexpr
auto
lexicographical_compare_three_way
|
(1) | (seit C++20) |
|
template
<
class
InputIt1,
class
InputIt2
>
constexpr
auto
lexicographical_compare_three_way
|
(2) | (seit C++20) |
Vergleicht zwei Bereiche lexikographisch
[
first1
,
last1
)
und
[
first2
,
last2
)
mittels Drei-Wege-Vergleich und erzeugt ein Ergebnis des stärksten anwendbaren Vergleichskategorientyps.
first1, last1, first2, last2, std:: compare_three_way ( ) ) ;
Wenn der Rückgabetyp nicht einer der drei Vergleichskategorien-Typen ist, ist das Programm fehlerhaft:
Inhaltsverzeichnis |
Parameter
| first1, last1 | - | das Paar von Iteratoren, das den ersten Bereich der zu untersuchenden Elemente definiert |
| first2, last2 | - | das Paar von Iteratoren, das den zweiten Bereich der zu untersuchenden Elemente definiert |
| comp | - | ein Funktionsobjekt |
| Typanforderungen | ||
-
InputIt1, InputIt2
müssen die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
Rückgabewert
Der Wert eines Vergleichskategorietyps, wie oben angegeben.
Komplexität
Gegeben N 1 als std:: distance ( first1, last1 ) und N 2 als std:: distance ( first2, last2 ) :
Mögliche Implementierung
template<class I1, class I2, class Cmp> constexpr auto lexicographical_compare_three_way(I1 f1, I1 l1, I2 f2, I2 l2, Cmp comp) -> decltype(comp(*f1, *f2)) { using ret_t = decltype(comp(*f1, *f2)); static_assert(std::disjunction_v< std::is_same<ret_t, std::strong_ordering>, std::is_same<ret_t, std::weak_ordering>, std::is_same<ret_t, std::partial_ordering>>, "Der Rückgabetyp muss ein Vergleichskategorietyp sein."); bool exhaust1 = (f1 == l1); bool exhaust2 = (f2 == l2); for (; !exhaust1 && !exhaust2; exhaust1 = (++f1 == l1), exhaust2 = (++f2 == l2)) if (auto c = comp(*f1, *f2); c != 0) return c; return !exhaust1 ? std::strong_ordering::greater: !exhaust2 ? std::strong_ordering::less: std::strong_ordering::equal; } |
Beispiel
#include <algorithm> #include <cctype> #include <compare> #include <iomanip> #include <iostream> #include <string_view> #include <utility> using namespace std::literals; void show_result(std::string_view s1, std::string_view s2, std::strong_ordering o) { std::cout << std::quoted(s1) << " is "; std::is_lt(o) ? std::cout << "less than ": std::is_gt(o) ? std::cout << "greater than ": std::cout << "equal to "; std::cout << std::quoted(s2) << '\n'; } std::strong_ordering cmp_icase(unsigned char x, unsigned char y) { return std::toupper(x) <=> std::toupper(y); }; int main() { for (const auto& [s1, s2] : { std::pair{"one"sv, "ONE"sv}, {"two"sv, "four"sv}, {"three"sv, "two"sv} }) { const auto res = std::lexicographical_compare_three_way( s1.cbegin(), s1.cend(), s2.cbegin(), s2.cend(), cmp_icase); show_result(s1, s2, res); } }
Ausgabe:
"one" is equal to "ONE" "two" is greater than "four" "three" is less than "two"
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 3410 | C++20 | überflüssige Vergleiche zwischen Iteratoren waren erforderlich | diese Anforderung entfernt |
Siehe auch
|
gibt
true
zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Funktions-Template) |
|
|
(C++20)
|
eingeschränktes Funktionsobjekt, das
x
<=>
y
implementiert
(Klasse) |
|
(C++20)
|
gibt
true
zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Algorithmus-Funktionsobjekt) |