Comment puis-je parcourir un std::map
en C ++? Ma carte est définie comme:
std::map< std::string, std::map<std::string, std::string> >
Par exemple, le conteneur ci-dessus contient des données comme ceci:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Comment puis-je parcourir cette carte et accéder aux différentes valeurs?
Réponses:
Ancienne question, mais les réponses restantes sont obsolètes à partir de C ++ 11 - vous pouvez utiliser une boucle à distance basée sur et faites simplement:
cela devrait être beaucoup plus propre que les versions antérieures et éviter les copies inutiles.
Certains préfèrent remplacer les commentaires par des définitions explicites des variables de référence (qui sont optimisées si inutilisées):
la source
const
aprèsauto
? Est-ce purement esthétique?int const *x
etint *const x
vous pouvez l'écrire commeint const *const x
ce qui est beaucoup plus clair que l'OMIconst int *const x
. Mais c'est juste analysé de gauche à droite, donc l'effet est le même. Voir les réponses à cette question: stackoverflow.com/questions/5503352/const-before-or-const-afterVous pouvez utiliser un itérateur.
la source
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
ou mieux en C ++ 0x:
la source
Avec C ++ 17 (ou version ultérieure), vous pouvez utiliser la fonction "liaisons structurées", qui vous permet de définir plusieurs variables, avec des noms différents, à l'aide d'un seul tuple / paire. Exemple:
La proposition originale (par les sommités Bjarne Stroustrup, Herb Sutter et Gabriel Dos Reis) est amusante à lire (et la syntaxe suggérée est plus intuitive à mon humble avis); il y a aussi le libellé proposé pour la norme qui est ennuyeux à lire mais qui est plus proche de ce qui va réellement entrer.
la source
Faites quelque chose comme ça:
la source
C ++ 11:
production:
la source
utiliser
std::map< std::string, std::map<std::string, std::string> >::const_iterator
lorsque la carte est const.la source
auto
frère, ou celui qui utilise vim ira KO.Comme einpoklum l'a mentionné dans sa réponse , depuis C ++ 17, vous pouvez également utiliser des déclarations de liaisons structurées . Je veux approfondir cela en fournissant une solution complète pour itérer sur une carte de cartes d'une manière confortable:
Remarque 1: Pour remplir la carte, j'ai utilisé une liste d'initialisation (qui est une fonctionnalité C ++ 11 ). Cela peut parfois être pratique pour garder les initialisations fixes compactes.
Remarque 2: Si vous souhaitez modifier la carte
m
dans les boucles, vous devez supprimer lesconst
mots clés.Code sur Coliru
la source
La première solution consiste à utiliser range_based pour la boucle, comme:
Remarque: Lorsque
range_expression
le type eststd::map
alorsrange_declaration
le type eststd::pair
.Code 1:
La deuxième solution:
Code 2
la source