如何在c ++中迭代对象列表

时间:2014-03-08 12:40:12

标签: c++ iterator

我对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’

5 个答案:

答案 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;
}