2012-10-08 1 views
1

Je voudrais réécrire cette boucle (qui fonctionne)Comment réécrire iterator-base pour la boucle en fonction gamme (11 C++)

for (vector<shared_ptr<Node<int>>>::iterator it = n.root.children.begin(); 
    it != n.root.children.end(); 
    ++it) 
    {cout << (*it)->value<<flush;} 

dans une gamme à base de boucle. Ce que j'ai essayé est

for (shared_ptr<Node<int>> child:(n.root).children){ 
     cout<<(child->value)<<" "<<flush; 
    } 

mais il me donne une décharge de base. La racine est de type Node

template <typename T> 
class Node{ 
public: 
    T value; 
    vector<shared_ptr<Node>> children; 
}; 

Ces lignes dans main.cpp fonctionnent très bien.

cout<<(n.root).value<<flush; 
cout<<n.root.children.front()->value<<flush; 

J'utilise g ++ 4.7.2.

Répondre

2

Et voilà. Essaye ça.

for (auto v : n.root.children) { 
    cout << v->value << flush; 
} 
+0

Cela semble vraiment bien. Malheureusement, le résultat est le même que ci-dessus - coredump. Le coredump se produit après que les valeurs ont été imprimées cependant. Comme si le compilateur ne savait pas quand terminer la boucle. – Slazer

+0

La réponse est une traduction directe de ce que nous avons reçu. La question devient maintenant, quel est le problème qui provoque un accident? Postez une version dépouillée mais compilable, et nous pouvons la résoudre. –

+4

'const auto & v' serait préférable d'éviter la copie inutile du type de valeur du conteneur. Pour 'std :: shared_ptr', il s'agit probablement d'un incrément et d'un décrément entrelacés. –

Questions connexes