2016-12-16 9 views
10

Die C++ Standard definiert einen std::map Konstruktor eines std::initializer_list:std :: map Initialisiererliste Konstruktor

map(std::initializer_list<value_type> init, const Allocator&); 

Wo jedoch ist definiert, was passiert, wenn die Initialisiererliste doppelten Schlüssel enthält? Ist der erste Schlüssel ausgewählt oder der letzte? Zum Beispiel:

std::map<std::string, int> my_map { 
    {"a", 1}, 
    {"a", 2} 
}; 

In der Praxis scheint es, es wie insert() verhält, so dass die Karte nun enthält {a: 1}.

Allerdings konnte ich nichts in der C++ - Standard diesbezüglich finden.

Antwort

5

N4296 (~ C++ 14)

Tabelle 102 - Assoziative Container Anforderungen

X(il); | Wie X(il.begin(), il.end()).

dann von oben in der Tabelle für den Iterator Ctor:

Effekte: einen leeren Behälter Konstruiert und fügt Elemente aus dem Bereich von [i, j) hinein; verwendet c als Vergleichsobjekt.

und

i und j InputIterator Anforderungen erfüllen und Elemente implizit konvertierbar value_type beziehen, bezeichnet [i,j) einen gültigen Bereich,

Beachten Sie, dass hier „und Elemente einfügt“ ist nicht markiert, um die insert Funktion anzuzeigen, aber ich nehme an, wir können es so interpretieren. Beachten Sie auch, dass i und jEingabe Iteratoren sind, also in Reihenfolge durchlaufen werden müssen.

.

(Es ist etwas schwieriger, diese Informationen zu finden, weil die entsprechenden Tabellen all

haben

il bezeichnet ein Objekt vom Typ initializer_list<value_type>

über sie, so kann bei der Suche nach initializer_list finden , aber für diese Tabelle ist das Wort über zwei Zeilen verteilt, mit einem Bindestrich an der Bruchstelle.)

+3

Technisch, zumindest aus den zitierten Teilen, scheint der Standard nicht zu diktieren, in welcher oder Die Elemente würden eingefügt werden. – user2079303

+0

@ user2079303 Besser? – BoBTFish

+2

Ich bin mir nicht sicher, ob das ausreicht.Sicher, wenn der übergebene Iterator nur ein Eingabe-Iterator ist, müssen sie der Reihe nach eingefügt werden, aber der Iterator von initializer_list ist ein Direktzugriffs-Iterator und ich sehe keine Regel, die die Spezialisierung für verschiedene Arten von Iteratoren verbietet. – user2079303

Verwandte Themen