2010-02-22 2 views
12

Ich habe die folgende Kartenstruktur: map < pair < int,int >, object* > und ich möchte darin einfügen.Wie man ein Paar in die Karte einfügt

Wie würde ich es tun, da ich ein Paar und ein Objekt und ich muss bilden ein Paar aus dieser einfügen möchte?

Sollte ich ein neues Paar mit make_pair() aus dem Paar und Objekt, das ich habe, erstellen? Wenn ja, kannst du mir bitte sagen, wie das geht?

+5

Welchen Code haben Sie ausprobiert? – Mark

Antwort

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

oder

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

Ich habe Ihren ersten Vorschlag verwendet - nett und prägnant. Vielen Dank! – Myx

+2

Wenn Sie dies häufig in Ihrem Code verwenden, sollten Sie die Map in eine Klasse mit einer Insert-Funktion (Paar, Objekt) einbetten, um die Lesbarkeit zu verbessern. –

1

Es gibt zwei Möglichkeiten:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. funktioniert nur, wenn der Schlüssel nicht bereits vorhanden ist, der Iterator zeigt auf das Paar mit dem Schlüsselwert und das bool zeigt an, ob es eingefügt wurde oder nicht.

  2. einfacher, aber wenn es bereits das Objekt nicht vorhanden ist zunächst standardmäßig aufgebaut und dann anstelle des Seins Kopie konstruiert zugewiesen

Wenn Sie haben, um über die Leistung keine Sorge, nur wählen, ob oder Sie möchten den vorherigen Eintrag nicht löschen. wahrscheinlich

+0

Korrekt, aber die Frage nach einer Karte mit einem Schlüsseltyp, der auch ein Paar ist. –

+0

Ich sehe die Abhängigkeit nicht. 'sed s/1/std :: make_pair (1,1)/g' und eine passend definierte' map_t'. Es ändert nichts an den Kommentaren oder irgendetwas, ich bevorzuge es einfach, mit einfachen Konzepten zu demonstrieren, um zu helfen, sich auf die wichtigen Punkte zu konzentrieren, anstatt sie in der Menge zu verstecken. –

10

Sie verwenden C++ 11 oder höher Unter der Annahme, ist der beste Ansatz:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

Für Karten, emplace kann als eine Version von insert gedacht werden, die den Schlüssel und den Wert als separate nimmt Argumente (es kann tatsächlich jede Kombination von Argumenten annehmen, die die entsprechenden Konstruktoren des Typs pair annehmen können). Abgesehen davon, dass es syntaktisch sauberer ist, ist es auch potentiell effizienter als make_pair, weil make_pair normalerweise eine Ausgabe erzeugt, deren Typ nicht exakt mit der des Containers übereinstimmt, und so eine unnötige Typumwandlung eingeht.

ich verwenden, um dies zu empfehlen, die auch nur C++ 11 arbeitet in oder später:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

Das den etwas überraschenden Einsatz von emplace vermeidet, aber es hat früher nicht, wenn der Schlüssel oder Wert arbeiten Typ ist nur Bewegung (zB unique_ptr). Das wurde im Standard behoben, aber die Standard-Bibliotheksimplementierung hat den Fehler möglicherweise noch nicht behoben. Dies könnte theoretisch auch etwas weniger effizient sein, aber in einer Weise, die jeder halbwegs ordentliche Compiler leicht optimieren kann.

+0

Ich denke, dass die offizielle Antwort und diese sollte basierend auf Compiler-Versionskriterien zusammengeführt werden – Aviv