web-dev-qa-db-ja.com

C ++でオブジェクトのリストを反復処理する方法

私は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’
31
Gottfried

あなたは近いです。

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代わりに。

52
Simple

->ポインタのように機能しますuを使用する必要はありません*

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

また、リストの値を変更するつもりがない場合は、次のように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;
}
1
Guy Avraham

C++ 11以降では、次のことができます。

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