I'm very new to C++ and struggling to figure out how I should iterate through a list of objects and access their members.
I've been trying this where data is a std::list and Student a class.
std::list<Student>::iterator<Student> it; for (it = data.begin(); it != data.end(); ++it) { std::cout<<(*it)->name; } and getting the following error:
error: base operand of ‘->’ has non-pointer type ‘Student’ 15 Answers
You're close.
std::list<Student>::iterator it; for (it = data.begin(); it != data.end(); ++it){ std::cout << it->name; } Note that you can define it inside the for loop:
for (std::list<Student>::iterator it = data.begin(); it != data.end(); ++it){ std::cout << it->name; } And if you are using C++11 then you can use a range-based for loop instead:
for (auto const& i : data) { std::cout << i.name; } Here auto automatically deduces the correct type. You could have written Student const& i instead.
Since C++ 11, you could do the following:
for(const auto& student : data) { std::cout << student.name << std::endl; } 4-> it works like pointer u don't have to use *
for( list<student>::iterator iter= data.begin(); iter != data.end(); iter++ ) cout<<iter->name; //'iter' not 'it' It is also worth to mention, that if you DO NOT intent to modify the values of the list, it is possible (and better) to use the const_iterator, as follows:
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; } 1if you add an #include <algorithm> then you can use the for_each function and a lambda function like so:
for_each(data.begin(), data.end(), [](Student *it) { std::cout<<it->name; });