2009-09-09 14 views
0

J'ai du mal à trouver des itérateurs pour les sous-conteneurs internes.Obtenir l'Iterator pour un conteneur STL interne?

imaginer Fondamentalement ce code simplifié:

typedef map<string, map<string, map> > double_map; 

double_map dm; 
.. //some code here 

for(double_map::iterator it = dm.begin(); it != dm.end(); it++){ 
    //some code here 
    it->first // string 
    it->second // <---- this is the 2nd map, how do i get its iterator so I can wrap it 
         //in a for loop like above? 
} 

Je dois pouvoir le faire sans utiliser typedefs pour chaque conteneur intérieur, est-il un moyen d'obtenir un itérateur pour le conteneur intérieur? J'ai une structure qui a 4 récipients intérieurs et je dois itérer à travers eux tous.

Répondre

3

(prenez garde, rien compilé dans les extraits suivants.)

for(double_map::iterator it = dm.begin(); it != dm.end(); it++){ 
    //some code here 
    it->first; // string 
    it->second.begin(); 
    it->second.end(); 
} 

Modifier: Je fI comprends votre commentaire correctement, vous voulez obtenir au type des itérateurs de la carte intérieure. Si tel est le cas, voici une façon:

double_map::mapped_type::iterator inner_iter = it->second.begin(); 

Du haut de ma tête, cela devrait fonctionner aussi:

double_map::value_type::second_type::iterator inner_iter = it->second.begin(); 
+0

Désolé ce n'est pas ce que je voulais dire , Je veux dire que j'ai besoin de stocker ces itérateurs dans un inner_type :: iterator it2 = it-> second.begin() puis boucle en utilisant ces itérateurs –

+0

Ahh c'est tout! Pourquoi n'ai-je pas pensé à mapped_type et value_type, ouais parfait c'est ce dont j'avais besoin. Merci! –

+0

Mais quand il y a des sous-conteneurs 3 ou 4 niveaux profonds je suppose que vous devez faire double_map :: mapped_type :: mapped_type :: mapped_type hmm, bien heureusement j'ai une typedef à mi-chemin par –

1

simple:

typedef map<string, map> inner_map; //Typedef for readability 
typedef map<string, inner_map > double_map; 

double_map dm; 
.. //some code here 
for(double_map::iterator it = dm.begin(); it != dm.end(); it++){ 
    //some code here 
    it->first // string 
    inner_map &innerMap(it->second); //Reference to the inner map for readability 
    for(inner_map::iterator it2 = innerMap.begin(); it2 != innerMap.end(); ++it2) { 
     //Do whatever you like 
    } 
} 
+0

qui était mon option de repli mais il y a quelques niveaux de sous-conteneurs et je veux le garder un peu générique sans utiliser typedefs pour chaque sous-conteneur. Fondamentalement, j'essaie de faire exactement cela sans le typedef –