Comment effectuer une itération sur un vecteur constant?

J’ai un vecteur de Student qui a un nom de champ.

Je veux parcourir le vecteur.

void print(const vector& students) { vector::iterator it; for(it = students.begin(); it < students.end(); it++) { cout <name << endl; } } 

Ceci est apparemment illégal en C ++.

S’il vous plaît aider.

Vous avez deux options (trois en C ++ 11): const_iterator s et indexes (+ “range-for” en C ++ 11)

 void func(const std::vector& vec) { std::vector::const_iterator iter; for (iter = vec.begin(); iter != vec.end(); ++iter) // do something with *iter /* or for (size_t index = 0; index != vec.size(); ++index) // do something with vec[index] // as of C++11 for (const auto& item: vec) // do something with item */ } 

Vous devriez préférer utiliser != lieu de < avec les iterators - ce dernier ne fonctionne pas avec tous les iterators, le premier le fera. Avec le premier, vous pouvez même rendre le code plus générique (pour que vous puissiez même changer le type de conteneur sans toucher à la boucle)

 template void func(const Container& container) { typename Container::const_iterator iter; for (iter = container.begin(); iter != container.end(); ++iter) // work with *iter } 

Utilisez plutôt const_iterator . Un iterator permet de modifier le vector , vous ne pouvez donc pas en obtenir depuis un conteneur const .

De plus, la manière idiomatique d’écrire cette boucle l’utilise it != students.end() au lieu de < (bien que cela devrait fonctionner sur un vector ).

Au lieu du vector::iterator , utilisez le vector::const_iterator .

 void print(const vector& students) { vector::const_iterator it; // const_iterator for(it = students.begin(); it != students.end(); it++) { cout << it->name << endl; } } 
 void print(const vector& students) { for(auto it = students.begin(); it != students.end(); ++it) { cout << it->name << endl; } } 

Style C ++ 11:

 void print(const vector& students) { for(auto const& student : students) { cout << student.name << endl; } }