Namensräume
Varianten
Aktionen

operator==,!=,<,<=,>,>=<=>(std::pair)

Von cppreference.com
< cpp‎ | utility‎ | pair
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
std::pair
Memberfunktionen
(C++11)
Nicht-Member-Funktionen
operator==operator!=operator<operator<=operator>operator>=operator<=>
(bis C++20)(bis C++20)(bis C++20)(bis C++20)(bis C++20)(C++20)
Hilfsklassen
Deduktionshilfen(C++17)
 
Definiert in der Header-Datei <utility>
(1)
template< class T1, class T2, class U1, class U2 >
bool operator==( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator==( const std::pair<T1, T2>& lhs,

                           const std::pair<U1, U2>& rhs );
(seit C++14)
(2)
template< class T1, class T2, class U1, class U2 >
bool operator!=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator!=( const std::pair<T1, T2>& lhs,

                           const std::pair<U1, U2>& rhs );
(seit C++14)
(bis C++20)
(3)
template< class T1, class T2, class U1, class U2 >
bool operator<( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator<( const std::pair<T1, T2>& lhs,

                          const std::pair<U1, U2>& rhs );
(seit C++14)
(bis C++20)
(4)
template< class T1, class T2, class U1, class U2 >
bool operator<=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator<=( const std::pair<T1, T2>& lhs,

                           const std::pair<U1, U2>& rhs );
(seit C++14)
(bis C++20)
(5)
template< class T1, class T2, class U1, class U2 >
bool operator>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator>( const std::pair<T1, T2>& lhs,

                          const std::pair<U1, U2>& rhs );
(seit C++14)
(bis C++20)
(6)
template< class T1, class T2, class U1, class U2 >
bool operator>=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(bis C++14)
template< class T1, class T2, class U1, class U2 >

constexpr bool operator>=( const std::pair<T1, T2>& lhs,

                           const std::pair<U1, U2>& rhs );
(seit C++14)
(bis C++20)
template< class T1, class T2, class U1, class U2 >

constexpr std::common_comparison_category_t<synth-three-way-result<T1, U1>,
                                            synth-three-way-result<T2, U2>>

    operator<=>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
(7) (seit C++20)
1,2) Prüft, ob beide Elemente von lhs und rhs gleich sind, d.h. vergleicht lhs.first mit rhs.first und lhs.second mit rhs.second.

Das Verhalten ist undefiniert, wenn Typ und Wertkategorie von entweder lhs.first == rhs.first oder lhs.second == rhs.second nicht die BooleanTestable-Anforderungen erfüllen.

(bis C++26)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn sowohl decltype(lhs.first == rhs.first) als auch decltype(lhs.second == rhs.second) boolean-testable modellieren.

(seit C++26)
3-6) Vergleicht lhs und rhs lexikographisch mittels operator<, d.h. vergleicht die ersten Elemente und nur wenn diese äquivalent sind, werden die zweiten Elemente verglichen. Das Verhalten ist undefiniert, wenn Typ und Wertkategorie von einem der lhs.first < rhs.first, rhs.first < lhs.first, oder lhs.second < rhs.second nicht die BooleanTestable-Anforderungen erfüllen.
7) Vergleicht lhs und rhs lexikographisch mittels synth-three-way, d.h. vergleicht die ersten Elemente und nur wenn diese äquivalent sind, werden die zweiten Elemente verglichen. synth-three-way-result ist der Rückgabetyp von synth-three-way.

Die Operatoren <, <=, >, >= und != sind synthetisiert aus operator<=> und operator== beziehungsweise.

(seit C++20)

Inhalt

[bearbeiten] Parameter

lhs, rhs - zu vergleichende Paare

[bearbeiten] Rückgabewert

1) true, wenn sowohl lhs.first == rhs.first als auch lhs.second == rhs.second, andernfalls false.
2) !(lhs == rhs)
3) Wenn lhs.first < rhs.first, wird true zurückgegeben. Andernfalls, wenn rhs.first < lhs.first, wird false zurückgegeben. Andernfalls, wenn lhs.second < rhs.second, wird true zurückgegeben. Andernfalls wird false zurückgegeben.
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
7) synth-three-way(lhs.first, rhs.first), wenn dieses nicht gleich 0 ist, andernfalls synth-three-way(lhs.second, rhs.second).

[bearbeiten] Hinweise

Die relationalen Operatoren sind über die operator< jedes Elements definiert.

(bis C++20)

Die relationalen Operatoren sind in Bezug auf synth-three-way definiert, der, wenn möglich, `operator<=>` und andernfalls `operator<` verwendet.

Insbesondere, wenn ein Elementtyp nicht selbst operator<=> bereitstellt, aber implizit in einen dreistufig vergleichbaren Typ konvertiert werden kann, wird diese Konvertierung anstelle von operator< verwendet.

(seit C++20)
Feature-Test-Makro Wert Std Feature
__cpp_lib_constrained_equality 202403L (C++26) Beschränkter operator== für std::pair

[bearbeiten] Beispiel

Da operator< für Paare definiert ist, können Container von Paaren sortiert werden.

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
 
int main()
{
    std::vector<std::pair<int, std::string>> v = {{2, "baz"}, {2, "bar"}, {1, "foo"}};
    std::sort(v.begin(), v.end());
 
    for (auto p : v)
        std::cout << '{' << p.first << ", " << std::quoted(p.second) << "}\n";
}

Ausgabe

{1, "foo"}
{2, "bar"}
{2, "baz"}

[bearbeiten] Berichte über Fehler

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 296 C++98 die Beschreibungen von Operatoren außer == und < fehlten hinzugefügt
LWG 2114
(P2167R3)
C++98 Typvoraussetzungen für boolesche Operationen fehlten hinzugefügt
LWG 3865 C++98 Vergleichsoperatoren akzeptierten nur `pair`s desselben Typs akzeptieren `pair`s unterschiedlicher Typen

[bearbeiten] Siehe auch

(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(C++20)
vergleicht die Werte im Tupel lexikographisch
(function template) [bearbeiten]