Вывести значения карты итератором - PullRequest
0 голосов
/ 02 мая 2018

Какой-то предлог:

class CComplex:CHotel
{

  protected:
    string m_complex;
    vector<CHotel> m_hoteli;
  public:
    CComplex(){};

    CComplex(string filename, string nComplex)
    {
        string str;
        m_complex = nComplex;
        fstream file(filename, ios::in);
        if (file.is_open())
        {
            string str;
            bool dfFlag = false;
            //CHotel temp(" ", 0, 0);
            //while (file >> temp)
            while (getline(file,str))
            {
                CHotel temp(str);
                m_hoteli.push_back(str);
            }
            file.close();
        }
        else
            throw "ERROR! ";
    }

Файл, из которого я читаю:

Марина 5 500 Джо | 21 | 1 | Тишо | 20 | 6 | Виктория | 31 | 20

Тюльпан 4 400 Сара | 41 | 17 | Росица | 49 | 14 | Валерия | 24 | 2

BlackSea 3 300 Джон | 35 | 12 | Джон | 35 | 11 | Янни | 28 | 6

SwissBell 5 600 Orlin | 26 | 1 | Маргарита | 27 | 2 | Джульетта | 31 | 3

Таким образом я заполняю m_hoteli вектор CHotel объектами, которые включают CTurist объект.

Используя контрольные точки и тестирование, я на 100% уверен, что получу значения отеля. Он также получил оценки студентов, но я не смог это проверить. Вот код для этого:

CHotel(string s)
{    
        CTurist b("",0);
        bool first = true;

        istringstream TList(s);

        string Days;
        int i = 0;
        string ime;
        string godini;

        if (first == true) {
            while (getline(TList, s, ' '))    //прочита целия ред като разделя стойностите базирано на разстояние
            {
                switch (i)
                {
                case 0: this->hName = s; break;  //взима стойността във файла,която е за име на хотел 
                case 1:this->stars = stoi(s); break;
                case 2:this->beds = stoi(s); break;
                }
                i++;
                if (i == 3)break;
            }
            first = false;    //сменя на false, за да се изпълни долния while
            i = 0;           //нулира, за да се стартира наново
        }
        while (getline(TList, s, '|'))  ////прочита целия ред като разделя стойностите базирано на |
        {
            switch (i)
            {
            case 0: ime= s; break;   //взима стойността във файла,която е за име на турист
            case 1: godini = s; break;  //взима стойността във файла,която е за години на турст
            case 2: Days = s; break;   //взима стойността във файла,която е за престой на турист
            }
            i++;
            if (i == 3)
            {
                //CTurist T1("ime", stoi(Days));
                CTurist T1(ime, stoi(godini));
                Turisti[T1] = stoi(Days);
                //Turisti.insert(T1("ime", stoi(Days))=Days);
                i = 0;
            }
        }
    }
    ...
}

Мои проблемы: я не могу перечислить туристов, которые являются частью каждого отеля. Вот функция, которую я имею:

void outputInfo()
{
   for (int i = 0; i < m_hoteli.size(); i++) {
      cout << "Tourists for hotel " << m_hoteli[i].getName2() << endl;
      std::map<CTurist, unsigned>::iterator it = Turisti.begin();
      for (auto it = Turisti.begin(); it != Turisti.end(); ++it) {
         cout << " Tourist: " << m_hoteli[i].Turisti[it].getName()
              << " Vuzrast: " << m_hoteli[i].Turisti[it].getAge()<< endl;
      }
   }
}

В этой строке:

cout << " Tourist: " << m_hoteli[i].Turisti[it].getName();

Я получаю следующую ошибку:

Ни один оператор [] не соответствует этим операндам.

Есть идеи, как сюда идти?

1 Ответ

0 голосов
/ 02 мая 2018

Вы бы исправили ошибку, правильно используя итератор, вот так:

for (int i = 0; i < m_hoteli.size(); i++)
{
    std::map<CTurist, unsigned>::iterator it = m_hoteli[i].Turisti.begin();

    for (; it != m_hoteli[i].Turisti.end(); ++it)
    {
        cout << " Tourist: " << it->first.getName(); // ...
    }
}

Но было бы лучше, как это

for (auto & hotel : m_hoteli)
{
    cout << "Tourists for hotel " << hotel.getName2() << endl;

    for (auto & mapElement : hotel.Turisti)
    {
        cout << " Tourist: " mapElement.first.getName(); // ...
    }
}

Чтобы получить дни для туриста, вы должны использовать mapElement.second.

...