vectors with a queue of pointers

Думал решить самостоятельно, но у меня уже не хватает полученных мною знаний (а самое главное времени). Суть такова: Перед открытием двух железнодорожных касс сформировались 2 очереди пассажиров, причем некоторые из них находятся сразу в обеих очередях. Для каждого пассажира известны его места в очередях и необходимое время обслуживания. Если у какого-либо пассажира очереди подходят одновременно, то он обслуживается в первой кассе.
Промоделировать работу касс, выдавая последовательно информацию об обслуживании пассажиров. В итоге я не могу понять, почему не корректно работают условия по проверке пассажира в двух кассах. Я предполагаю, что я не правильно работаю с итераторами. Прошу помочь объяснить (а если и покажите верное решение, то я буду вам очень благодарен).

Тестовые данные в текстовом файле: [a 3] [b 2] [a 2] [a 3] [e 8] [b 2] [a 5] [a 2] [b 2] [b 3] [b 5] [a 3] [e 5] [b 3] [a 5] [b 6] (просто вставить), где a - 1 касса, b - 2 касса, e - в 2-ух кассах

#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;

struct Passenger {  //пассажир структура
    char queue_pos;
    int service_time;
    Passenger* next;
};

int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    ifstream file("passengers.txt"); //файл с которого читаем

    vector<Passenger> cash_register_1;  //касса 1
    vector<Passenger> cash_register_2;  //касса 2

    Passenger* top = 0; //список пуст
    string str;
    char k, queue_cash;
    int time = 0;
    while (!file.eof()) //запись пассажиров в кассы
    {
        file >> k;
        if (k == '[')
        {
            while (k != ']') //чтение данных пассажира
            {
                file >> k;
                if ((k >= '1') && (k <= '9'))
                {
                    time = k - '0';

                }
                if ((k == 'a') || (k == 'b') || (k == 'e'))
                {
                    queue_cash = k;

                }
            }

            Passenger* c = new Passenger;   //запись пассажира в кассы
            c->queue_pos = queue_cash;
            c->service_time = time;
            c->next = top;
            top = c;
            if (c->queue_pos == 'a')
            {
                cash_register_1.push_back({ queue_cash, time });
            }
            if (c->queue_pos == 'b')
            {
                cash_register_2.push_back({ queue_cash, time });
            }
            if (c->queue_pos == 'e')
            {
                cash_register_1.push_back({ queue_cash, time });
                cash_register_2.push_back({ queue_cash, time });
            }
        }
    }





    if ((cash_register_1.empty()) && (cash_register_2.empty())) //свободны ли кассы
    {
        cout << "Ошибка: Обе кассы свободные" << endl;
    }
    else//заполнены
    {
        int reg1 = 0;
        int reg2 = 0;
        cash_register_1[reg1];
        cash_register_2[reg2];
//проверка вектора
        //for (int i = 0; i < cash_register_1.size(); i++)
        //{
        //  printf("%d", cash_register_1[reg1].service_time);
        //  reg1 += 1;
        //}
        //cout << " ";
        //for (int i = 0; i < cash_register_2.size(); i++)
        //{
        //  printf("%d", cash_register_2[reg2].service_time);
        //  reg2 += 1;
        //}

        while ((!cash_register_1.empty()) || (!cash_register_2.empty()))
        {//начало проверки пассажира в двух кассах
            if ((cash_register_1[reg1].queue_pos == 'e') || (cash_register_2[reg2].queue_pos == 'e'))   //проверка на наличие в двух кассах
            {
                if ((cash_register_1[reg1].queue_pos == 'e') && (cash_register_2[reg2].queue_pos == 'e'))   //если в первой и в второй одновременно
                {
                    cash_register_2.erase(cash_register_2.begin());
                    cash_register_1.erase(cash_register_1.begin());
                }
                else
                {
                    if (cash_register_1[reg1].queue_pos == 'e') //если только в первой
                    {
                        vector<Passenger> ::iterator it = cash_register_2.begin();
                        auto& iter = *it;
                        do
                        {
                            if (it -> service_time == 'e')
                            {
                                cash_register_2.erase(it);
                            }
                            reg2 += 1;
                            it += 1;
                        
                        } while (cash_register_2[reg2].queue_pos != 'e');
                    }

                    if (cash_register_2[reg2].queue_pos == 'e') //если только в второй
                    {
                        vector<Passenger> ::iterator it = cash_register_1.begin();
                        auto& iter = *it;
                        do
                        {
                            if (cash_register_1[reg1].queue_pos == 'e')
                            {
                                cash_register_1.erase(it);
                            }
                            reg1 += 1;
                        } while (cash_register_1[reg1].queue_pos != 'e');
                    }
                }
            }//конец проверки пассажира в двух кассах

            if (cash_register_1[reg1].service_time > cash_register_2[reg2].service_time)    //если 1 > 2
            {
                cash_register_1[reg1].service_time = cash_register_1[reg1].service_time - cash_register_2[reg2].service_time;
                cash_register_2.erase(cash_register_2.begin());
                printf("%d", cash_register_1[reg1].service_time);
                printf("%s", " ");
                printf("%d", cash_register_2[reg2].service_time);
                printf("%s", "\n");
            }
            else
            {
                if (cash_register_1[reg1].service_time < cash_register_2[reg2].service_time)    //если 1 < 2
                {
                    cash_register_2[reg2].service_time = cash_register_2[reg2].service_time - cash_register_1[reg1].service_time;
                    cash_register_1.erase(cash_register_1.begin());
                    printf("%d", cash_register_1[reg1].service_time);
                    printf("%s", " ");
                    printf("%d", cash_register_2[reg2].service_time);
                    printf("%s", "\n");
                }
                else
                {
                    if (cash_register_1[reg1].service_time == cash_register_2[reg2].service_time)   //если равны
                    {
                        cash_register_1.erase(cash_register_1.begin());
                        cash_register_2.erase(cash_register_2.begin());
                        printf("%d", cash_register_1[reg1].service_time);
                        printf("%s", " ");
                        printf("%d", cash_register_2[reg2].service_time);
                        printf("%s", "\n");
                    }
                }
            }
        }
    }
    return 0;
}

Ответы (1 шт):

Автор решения: Daniil

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

#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;

struct Passenger {  //пассажир структура
    char Name;
    int service_time;
    Passenger* next;
};

int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    ifstream file("passengers.txt"); //файл с которого читаем

    vector<Passenger> cash_register_1;  //касса 1
    vector<Passenger> cash_register_2;  //касса 2

    Passenger* top = 0; //список пуст
    string str;
    char k, name = ' ';
    int time = 0, pos = 0, i = 0;
    while (!file.eof()) //запись пассажиров в кассы
    {
        file >> k;
        while (pos == 0)
        {
            file >> k;
            if ((k >= 'A') && (k <= 'Z'))
            {
                while (k != ')')
                {
                    if ((k >= 'A') && (k <= 'Z'))
                    {
                        name = k;
                    }
                    if ((k >= '1') && (k <= '9'))
                    {
                        time = k - '0';
                    }
                    file >> k;
                }
                    Passenger* c = new Passenger;
                    c->Name = name;
                    c->service_time = time;
                    c->next = top;
                    top = c;    
                    cash_register_1.push_back({ name, time });
            }
            if (k == ';')
            {
                pos = 1;
            }
        }
        while (pos == 1)
        {
            file >> k;
            if ((k >= 'A') && (k <= 'Z'))
            {
                while (k != ')')
                {
                    if ((k >= 'A') && (k <= 'Z'))
                    {
                        name = k;
                    }
                    if ((k >= '1') && (k <= '9'))
                    {
                        time = k - '0';
                    }
                    file >> k;
                }
                Passenger* c = new Passenger;
                c->Name = name;
                c->service_time = time;
                c->next = top;
                top = c;
                cash_register_2.push_back({ name, time });
            }
            if (k == ';')
            {
                pos = 2;
            }
        }
    }
    if ((cash_register_1.empty()) && (cash_register_2.empty())) //свободны ли кассы
    {
        cout << "Ошибка: Обе кассы свободные" << endl;
    }
    else//заполнены
    {
        int reg1 = 0, reg2 = 0;
        cout << "Пассажиры 1 кассы: ";
        for (int i = 0; i < cash_register_1.size(); i++)
        {
            printf("%c", cash_register_1[reg1].Name);
            reg1 += 1;
            cout << " ";
        }
        cout << endl;
        cout << "Пассажиры 2 кассы: ";
        for (int i = 0; i < cash_register_2.size(); i++)
        {
            printf("%c", cash_register_2[reg2].Name);
            reg2 += 1;
            cout << " ";
        }
        cout << endl;
        reg1 = 0, reg2 = 0;
        int total1 = 0, total2 = 0;
        int i = 0, m = 1;
        total1 = total1 + cash_register_1[reg1].service_time;
        total2 = total2 + cash_register_2[reg2].service_time;
        while ((reg1 != cash_register_1.size()) || (reg2 != cash_register_2.size()))
        {
            if ((reg1 == cash_register_1.size()) || (reg2 == cash_register_2.size())) //проверка, если остались какие-либо пустые вектора
            {
                break;
            }
            if (cash_register_1[reg1].Name == cash_register_2[reg2].Name)
            {
                vector<Passenger> ::iterator it = cash_register_2.begin(); //удаляем из 2 кассы
                auto& iter = *it;
                i = 0, m = 1;
                char id_passenger = cash_register_1[reg1].Name;
                while (i < cash_register_2.size())
                {
                    if (it->Name == id_passenger)
                    {
                        cash_register_2.erase(it);
                        i = cash_register_2.size();
                    }
                    else
                    {
                        if (m != cash_register_2.size())
                        {
                            it += 1;
                            m += 1;
                        }
                        else
                        {
                            i = cash_register_2.size();
                        }
                    }
                }
            }
            else
            {
                vector<Passenger> ::iterator it = cash_register_2.begin(); //удаляем из 2 кассы
                auto& iter = *it;
                i = 0, m = 1;
                char id_passenger = cash_register_1[reg1].Name;
                while (i < cash_register_2.size())
                {
                    if (it->Name == id_passenger)
                    {
                        cash_register_2.erase(it);
                        i = cash_register_2.size();
                    }
                    else
                    {
                        if (m != cash_register_2.size())
                        {
                            it += 1;
                            m += 1;
                        }
                        else
                        {
                            i = cash_register_2.size();
                        }
                    }
                }
                vector<Passenger> ::iterator itt = cash_register_1.begin(); //удаляем из 1 кассы
                auto& ites = *itt;
                i = 0, m = 1;
                id_passenger = cash_register_2[reg2].Name;
                while (i < cash_register_1.size())
                {
                    if (itt->Name == id_passenger)
                    {
                        cash_register_1.erase(itt);
                        i = cash_register_1.size();
                    }
                    else
                    {
                        if (m != cash_register_1.size())
                        {
                            itt += 1;
                            m += 1;
                        }
                        else
                        {
                            i = cash_register_1.size();
                        }
                    }
                }
                if (total1 > total2)
                {   
                    if (reg2 == cash_register_2.size())
                    {
                        break;
                    }
                    else
                    {
                        reg2 += 1;
                        total2 = total2 + cash_register_2[reg2].service_time;
                    }
                }
                else
                {
                    if (total1 < total2)
                    {   
                        if (reg1 == cash_register_1.size())
                        {
                            break;
                        }
                        else
                        {
                            reg1 += 1;
                            total1 = total1 + cash_register_1[reg1].service_time;
                        }
                    }
                    else
                    {
                        if (reg1 != cash_register_1.size())
                        {
                            reg2 += 1;
                        }
                        if (reg2 != cash_register_2.size())
                        {
                            reg1 += 1;
                        }
                    }
                }   
                
            }
        }
        reg1 = 0, reg2 = 0, total1 = 0, total2 = 0;
        cout << "Пассажиры 1 кассы, которые были обслужены: ";
        for (int i = 0; i < cash_register_1.size(); i++)
        {
            printf("%c", cash_register_1[reg1].Name);
            cout << '[' << total1 << ',';
            total1 = total1 + cash_register_1[reg1].service_time;
            cout << total1 << ']';
            reg1 += 1;
            cout << " ";
        }
        cout << endl;
        cout << "Пассажиры 2 кассы, которые были обслужены: ";
        for (int i = 0; i < cash_register_2.size(); i++)
        {
            printf("%c", cash_register_2[reg2].Name);
            cout << '[' << total2 << ',';
            total2 = total2 + cash_register_2[reg2].service_time;
            cout << total2 << ']';
            reg2 += 1;
            cout << " ";
        }
        cout << endl;
    }
    cout << "Все пассажиры обслужены в кассах" << endl;
    return 0;
}
→ Ссылка