Маленькая проблема, перебирающая список пользовательских структур в C ++ - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь распечатать свой список, составленный из структур, с итераторами, но я не могу этого сделать, поскольку итератор не может указать на моего soldier.index (), могу ли я знать, что я делаю неправильно?

Я получаю

[Ошибка] У 'std :: list :: iterator' нет члена с именем 'index'.

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

struct Soldier
{
    int index;
    bool isAlive = true;
};

int main()
{
list<Soldier>company;
list<Soldier>::iterator it;


int N;
int number_of_reports;

cin >> N;
for(int i = 0; i < N; i++)
{
    Soldier soldier;
    soldier.index = i;
    company.push_back(soldier);
}

cin >> number_of_reports;
while(number_of_reports--)
{
    for(it = company.begin(); it != company.end(); it++)
    {
        cout << it.index() << endl;
    }
}
return 0;
}

Ответы [ 4 ]

0 голосов
/ 29 сентября 2018

Это на самом деле сложный вопрос.Я не знаю учебный план вашего класса, но я вижу, что введение в стандартную библиотеку имеет много нюансов.

Итератор - полноценный объект.Он действительно ничего не знает о вашей структуре солдата.Он знает, как работать с std :: list, который содержит ваши припои.Он полон перегруженных операторов.И в этот момент я вижу, где вода становится грязной.То есть вы еще не узнали о перегрузке операторов, но собираетесь использовать?Ожидается, что вы будете обращаться с итератором как с черным ящиком, поэтому вы должны слепо следовать определенным правилам.В этом случае вам следовало сказать, что итератор имеет доступ к вашим объектам в контейнере, и единственный способ добраться до этого объекта - использовать магию it->thing.

Если вы узнали оперегрузка должна быть указана на то, что -> является перегрузкой итератора.оператор возвращает указатель на ваш объект.Или, по крайней мере, вы можете просто думать об итераторе как о сыром указателе, он выглядит так же.Вы уже знакомы с указателями?

И, как он появился.

for( auto& item : container )...;

Является ли языковая конструкция.Он просто делает то же самое, что и:

for (it = company.begin(); it != company.end(); it++)
{
    auto& item= *it;
    std::cout << item.index << std::endl;
}

И снова, обрабатывая итератор как указатель, на этот раз используя оператор звездочки.

https://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_indirection_operator

Если вы собираетесь стать опытным программистом на C ++, вам необходимо изучить, как работает язык и стандартная библиотека.

Также, пожалуйста, избавьтесь от привычки:

using namespace std;
0 голосов
/ 29 сентября 2018

Лучший способ сделать это с помощью ранга для цикла :

for (auto& s : company)
{
    cout << s.index << endl;
}

Демонстрационная версия: https://wandbox.org/permlink/ybiYdbGhcQEfYizH

0 голосов
/ 29 сентября 2018

Я думаю, вы хотите сделать это:

for (list<Soldier>::iterator it = company.begin(); it != company.end(); ++it)
{
    cout << it->index << endl;
}
0 голосов
/ 29 сентября 2018

Это должно быть it->index, а не it.index().

...