我对c ++很陌生,并努力弄清楚如何迭代对象列表并访问成员。
我一直在尝试这个,'数据'是列表而'学生'是一个类。
std::list<Student>::iterator<Student> it;
for(it = data.begin(); it != data.end(); ++it){
std::cout<<(*it)->name;
}
并收到以下错误
error: base operand of ‘->’ has non-pointer type ‘Student’
答案 0 :(得分:48)
你很亲密。
std::list<Student>::iterator it;
for (it = data.begin(); it != data.end(); ++it){
std::cout << it->name;
}
请注意,您可以在it
循环中定义for
:
for (std::list<Student>::iterator it = data.begin(); it != data.end(); ++it){
std::cout << it->name;
}
如果您使用的是C ++ 11,那么您可以改为使用基于范围的for
循环:
for (auto const& i : data) {
std::cout << i.name;
}
此处auto
会自动推断出正确的类型。您可以改为编写Student const& i
。
答案 1 :(得分:2)
- &GT;它像指针一样工作,你不必使用*
for( list<student>::iterator iter= data.begin(); iter != data.end(); iter++ )
cout<<iter->name; //'iter' not 'it'
答案 2 :(得分:2)
如果添加#include <algorithm>
,则可以使用for_each
函数和lambda函数,如下所示:
for_each(data.begin(), data.end(), [](Student *it)
{
std::cout<<it->name;
});
您可以在https://en.cppreference.com/w/cpp/algorithm
上了解有关算法库的更多信息。以及有关https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019中的cpp中的lambda函数
答案 3 :(得分:1)
值得一提的是,如果您不打算修改列表的值,则可以(并且更好)使用const_iterator,如下所示:
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;
}
答案 4 :(得分:0)
自C ++ 11起,您可以执行以下操作:
for(const auto& student : data)
{
std::cout << student.name << std::endl;
}