Je suis très nouveau en c ++ et j'ai du mal à comprendre comment je devrais parcourir une liste d'objets et y accéder.
J'ai essayé ceci où «données» est la liste et «étudiant» une classe.
std::list<Student>::iterator<Student> it;
for(it = data.begin(); it != data.end(); ++it){
std::cout<<(*it)->name;
}
et obtenir l'erreur suivante
error: base operand of ‘->’ has non-pointer type ‘Student’
Tu es proche.
std::list<Student>::iterator it;
for (it = data.begin(); it != data.end(); ++it){
std::cout << it->name;
}
Notez que vous pouvez définir it
dans la boucle for
:
for (std::list<Student>::iterator it = data.begin(); it != data.end(); ++it){
std::cout << it->name;
}
Et si vous utilisez C++ 11, vous pouvez utiliser une boucle for
basée sur une plage:
for (auto const& i : data) {
std::cout << i.name;
}
Ici, auto
déduit automatiquement le type correct. Vous auriez pu écrire Student const& i
à la place.
-> cela fonctionne comme un pointeur, vous n'avez pas à utiliser *
for( list<student>::iterator iter= data.begin(); iter != data.end(); iter++ )
cout<<iter->name; //'iter' not 'it'
Il convient également de mentionner que si vous N'AVEZ PAS l'intention de modifier les valeurs de la liste, il est possible (et mieux) d'utiliser le const_iterator, comme suit:
for (std::list<Student>::const_iterator it = data.begin(); it != data.end(); ++it){
// do whatever you wish but don't modify the list elements
std::cout << it->name;
}
Depuis C++ 11, vous pouvez effectuer les opérations suivantes:
for(const auto& student : data)
{
std::cout << student.name << std::endl;
}