2009-07-21 7 views
0

Je voudrais créer deux conteneurs contenant des itérateurs. Je voudrais le faire avec espoir sans introduire de types intermédiaires/indirects. Est-ce possible ou fait-il des types d'itérateurs en fonction de la connaissance de la taille du type de données du conteneur?Conteneur C++ d'itérateurs et références circulaires

Voici quelques exemples de code que je voudrais obtenir la compilation:

#include <map> 
#include <deque> 
#include <string> 

class mapvalue_t 
{ 
    public: 
    std::deque< std::map<std::string,mapvalue_t>::iterator >::iterator i; 
}; 

typedef std::map<std::string,mapvalue_t> maptype_t; 
typedef std::deque<maptype_t::iterator> queuetype_t; 

int main(void) 
{ 
    maptype_t m; 
    queuetype_t q; 
} 

Peu importe, il compile maintenant. J'avais une file d'attente là, plutôt que mon deque prévu :)

+1

Je ne suis pas sûr d'éditer votre question à plus-être-une question est une bonne pratique. –

Répondre

2

Cela fonctionne si vous utilisez un deque au lieu d'un queue. Queue n'est pas un conteneur, mais une façade de sorte qu'il ne supporte pas l'appel ::iterator.

De cplusplus.com:

files d'attente sont mises en oeuvre comme des adaptateurs de conteneurs, qui sont des classes qui utilisent un objet encapsulé d'une classe de conteneur spécifique comme conteneur sous-jacent, en fournissant un ensemble de fonctions membres pour y accéder éléments. Les éléments sont poussés dans le "dos" du conteneur spécifique et sauté de son "front".

1

Vous devriez faire très attention au stockage des itérateurs. La modification de la collection peut facilement invalider tous les itérateurs. Vous feriez mieux de stocker un identifiant ou un pointeur (géré).

+0

En effet. Votre liste d'itérateurs stockée sera invalidée chaque fois que la carte sera modifiée de quelque façon que ce soit. Vous devez stocker les valeurs clés dans le mappage. – Kieveli

+0

Pas tout à fait vrai. Pour la carte et la liste, l'insertion et la suppression d'éléments n'invalident aucun itérateur (sauf bien sûr pour celui qui est supprimé). Ma question devrait avoir une liste et non une deque, mais je ne sais pas si je devrais encore mettre la question à jour. – Alex77

+0

Si nous comptons sur des implémentations spécifiques. Je ne pense pas que cela soit garanti par la norme. – DanDan

Questions connexes