Gibt es einen Unterschied zwischen einem std::pair
und einem std::tuple
mit nur zwei Mitgliedern? (Neben dem Offensichtlichen, das std::pair
zwei und nur zwei Mitglieder erfordert und tuple
mehr oder weniger haben kann ...)
88
Es gibt einige Unterschiede:
std::tuple
kann niemals durch seine Standard-Layout (zumindest ist es nicht erforderlich , von der Norm sein). Jedes std::pair<T, Y>
ist Standard-Layout, wenn beide T
und Y
Standard-Layout sind.
Es ist ein bisschen einfacher, den Inhalt von a pair
als a zu bekommen tuple
. Sie müssen in dem tuple
Fall einen Funktionsaufruf verwenden , während der pair
Fall nur ein Mitgliedsfeld ist.
Aber das war es schon.
.first
und.second
praktisch, bieten sie keine Hilfe, wenn ein drittes (oder mehr) Mitglied (e) für eine Codeänderung erforderlich sind. Mir ist aufgefallen, dass ich in der Regelstd::get
unabhängig von Getters verwende, sodass ich nicht alles ändern muss, nur die Datentypen und allemake_pair
Aufrufe zumake_tuple
Anrufen.std::map
Anwendungenstd::pair<const Key,T>
alsvalue_type
auch in C ++ 11. Wo genau werden Tupel verwendetstd::map
?std::map
.Dies ist eine sehr späte Antwort. Beachten Sie jedoch, dass
std::pair
die Größe aufgrund der Definition mit Elementvariablen nicht mithilfe der Optimierung für leere Basisklassen optimiert werden kann (first
undsecond
unterschiedliche Adressen belegen muss, selbst wenn eine oder beide eine leere Klasse sind). Dies wird durch die jeweiligen Ausrichtungsanforderungen noch verschärftsecond_type
, sodass das Ergebnis im schlimmsten Fall imstd::pair
Grunde doppelt so groß ist, wie es sein muss.std::tuple
Ermöglicht nur den Zugriff über Hilfsfunktionen, sodass er von beiden Typen abgeleitet werden kann, wenn der eine oder andere leer ist, wodurch Overhead gespart wird. Zumindest die Implementierung von GCC macht dies definitiv ... Sie können die Header durchsehen, um dies zu überprüfen, aber es gibt auch dies als Beweis.quelle
[[no_unique_address]]
denstd::pair
Nachteil beseitigen .Ein
std::tuple
‚s Name ist länger (ein zusätzliches Zeichen). Weitere dieser Zeichen werden mit der rechten Hand eingegeben, sodass die meisten Benutzer sie leichter eingeben können.Das heißt,
std::pair
kann nur zwei Werte haben - nicht null, eins, drei oder mehr. ZWEI Werte. Ein Tupel hat jedoch fast keine semantische Begrenzung der Anzahl von Werten. Einstd::pair
typensicherer Typ ist daher genauer, wenn Sie tatsächlich ein Wertepaar angeben möchten.quelle
std::tuple<>
ist auch typsicher (wie könnte es nicht sein?) Und unterscheidet2
sich semantisch nicht vonpair
.Beachten Sie, dass mit C ++ 17 dieselbe Schnittstelle verwendet werden kann, um Daten sowohl aus Paaren als auch aus Tupeln mit zwei Elementen zu lesen.
Keine Notwendigkeit zu verwenden
get<>
:)quelle
Für das, was es wert ist, finde ich die GDB-Ausgabe von std :: tuple weitaus schwieriger zu lesen. Wenn Sie mehr als 2 Werte benötigen, funktioniert std :: pair natürlich nicht, aber ich halte dies für einen Punkt zugunsten von Strukturen.
quelle
std::get<0>(tupleName)
in einen Getter ein;GetX()
ist viel einfacher zu lesen und kürzer. Es hat einen kleinen Nachteil, dassconst
jemand so etwas Dummes tun kann , wenn man vergisst, es zu einer Methode zu machen :GetX() = 20;
.