2016-12-16 4 views
10

La norme C++ définit un constructeur std::map utilisant un std::initializer_list:std :: carte constructeur liste initialiseur

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

Cependant, où est défini ce qui se passe si la liste contient des clés d'initialisation en double? La première clé est-elle choisie, ou la dernière? Par exemple:

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

Dans la pratique, il semble qu'il se comporte comme insert(), de sorte que la carte contient maintenant {a: 1}.

Cependant, je n'ai pas pu trouver quoi que ce soit dans la norme C++ à ce sujet.

Répondre

5

N4296 (~ C++ 14)

Tableau 102 - exigences de conteneurs associatifs

X(il); | Identique à X(il.begin(), il.end()).

Puis au-dessus de la table, pour l'itérateur cteur:

Effets: Construit un conteneur vide et insère les éléments de la gamme [i, j) en elle; utilise c comme objet de comparaison.

et

i et j satisfaire entrée exigences iterator et se référer à des éléments implicitement convertibles à value_type, [i,j) désigne une plage valide,

Notez que "et insère des éléments" ici est pas marqué pour indiquer la fonction insert, mais je suppose que nous pouvons l'interpréter de cette façon. Notez également que i et j sont l'entrée itérateurs, donc doivent être traversés dans l'ordre.

.

(Il est un peu plus difficile de trouver ces informations, parce que les tables équivalentes ont tous

il désigne un objet de type initializer_list<value_type>

-dessus d'eux, peut donc être trouvé en recherchant initializer_list , mais pour cette table le mot est divisé sur deux lignes, avec un trait d'union à la coupure.)

+3

Techniquement, au moins à partir des parties citées, la norme ne semble pas dicter dans lequel ou der les éléments seraient insérés. – user2079303

+0

@ user2079303 Mieux? – BoBTFish

+2

Je ne suis pas sûr que ce soit suffisant.Certes, lorsque l'itérateur passé est simplement un itérateur d'entrée, ils doivent être insérés dans l'ordre, mais l'itérateur d'initializer_list est un itérateur d'accès aléatoire et je ne vois pas de règle interdisant la spécialisation pour différents types d'itérateurs. – user2079303