web-dev-qa-db-fra.com

Comment parcourir une liste d'objets en c ++

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’
27
Gottfried

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.

44
Simple

-> 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'
2
Radek

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;
}
1
Guy Avraham

Depuis C++ 11, vous pouvez effectuer les opérations suivantes:

for(const auto& student : data)
{
  std::cout << student.name << std::endl;
}
0
jhill515