wake-up-neo.net

Durchlaufen einer Liste von Objekten in C++

Ich bin sehr neu in C++ und versuche herauszufinden, wie ich eine Liste von Objekten durchlaufen und auf Mitglieder zugreifen sollte.

Ich habe dies versucht, wobei "Daten" die Liste und "Schüler" eine Klasse sind.

std::list<Student>::iterator<Student> it;
for(it = data.begin(); it != data.end(); ++it){
    std::cout<<(*it)->name;
}

und den folgenden Fehler erhalten

error: base operand of ‘->’ has non-pointer type ‘Student’
27
Gottfried

Du bist in der Nähe.

std::list<Student>::iterator it;
for (it = data.begin(); it != data.end(); ++it){
    std::cout << it->name;
}

Beachten Sie, dass Sie it innerhalb der for-Schleife definieren können:

for (std::list<Student>::iterator it = data.begin(); it != data.end(); ++it){
    std::cout << it->name;
}

Wenn Sie C++ 11 verwenden, können Sie stattdessen eine bereichsbasierte for-Schleife verwenden:

for (auto const& i : data) {
    std::cout << i.name;
}

Hier leitet auto automatisch den richtigen Typ ab. Sie könnten stattdessen Student const& i geschrieben haben.

44
Simple

-> es funktioniert wie ein Zeiger, den Sie nicht benutzen müssen *

for( list<student>::iterator iter= data.begin(); iter != data.end(); iter++ )
cout<<iter->name; //'iter' not 'it'
2
Radek

Es ist auch erwähnenswert, dass, wenn Sie NICHT beabsichtigen, die Werte der Liste zu ändern, der const_iterator wie folgt verwendet werden kann (und besser ist):

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

Seit C++ 11 können Sie Folgendes tun:

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