Gibt es einen Unterschied zwischen einem std::pairund einem std::tuplemit nur zwei Mitgliedern? (Neben dem Offensichtlichen, das std::pairzwei und nur zwei Mitglieder erfordert und tuplemehr oder weniger haben kann ...)
Antworten:
Es gibt einige Unterschiede:
std::tuplekann niemals durch seine Standard-Layout (zumindest ist es nicht erforderlich , von der Norm sein). Jedes std::pair<T, Y>ist Standard-Layout, wenn beide Tund YStandard-Layout sind.
Es ist ein bisschen einfacher, den Inhalt von a pairals a zu bekommen tuple. Sie müssen in dem tupleFall einen Funktionsaufruf verwenden , während der pairFall nur ein Mitgliedsfeld ist.
Aber das war es schon.
std::mapAnwendungen std::pair<const Key,T>als value_typeauch in C ++ 11. Wo genau werden Tupel verwendet std::map?
std::map.
Dies ist eine sehr späte Antwort. Beachten Sie jedoch, dass std::pairdie Größe aufgrund der Definition mit Elementvariablen nicht mithilfe der Optimierung für leere Basisklassen optimiert werden kann ( firstund secondunterschiedliche 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::pairGrunde doppelt so groß ist, wie es sein muss.
std::tupleErmö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::pairNachteil 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::pairkann 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::pairtypensicherer 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 2sich 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 constjemand so etwas Dummes tun kann , wenn man vergisst, es zu einer Methode zu machen : GetX() = 20;.
.firstund.secondpraktisch, 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::getunabhängig von Getters verwende, sodass ich nicht alles ändern muss, nur die Datentypen und allemake_pairAufrufe zumake_tupleAnrufen.