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 ...)
Antworten:
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.
std::map
Anwendungen std::pair<const Key,T>
als value_type
auch in C ++ 11. Wo genau werden Tupel verwendet std::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
und second
unterschiedliche Adressen belegen muss, selbst wenn eine oder beide eine leere Klasse sind). Dies wird durch die jeweiligen Ausrichtungsanforderungen noch verschärft second_type
, sodass das Ergebnis im schlimmsten Fall im std::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.
[[no_unique_address]]
den std::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. Ein std::pair
typensicherer Typ ist daher genauer, wenn Sie tatsächlich ein Wertepaar angeben möchten.
std::tuple<>
ist auch typsicher (wie könnte es nicht sein?) Und unterscheidet 2
sich semantisch nicht von pair
.
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.
std::get<0>(tupleName)
in einen Getter ein; GetX()
ist viel einfacher zu lesen und kürzer. Es hat einen kleinen Nachteil, dass const
jemand so etwas Dummes tun kann , wenn man vergisst, es zu einer Methode zu machen : GetX() = 20;
.
.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.