c ++ Вектор вне диапазона с изменяющейся переменной - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть задание, где у меня есть светофор, который меняет направление и позволяет машинам проезжать один за другим.Направление меняется по часовой стрелке.Я реализовал код, который читает начальное направление запуска, проезжающие машины в каждом направлении и код, который читает номерной знак, направление и время, необходимое для прохождения.Проблемы возникают, когда он переключается с E на S на W на N, но затем он застревает, и я сталкиваюсь с вектором вне диапазона

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct cars
{
    string name;
    char dr;
    int t;
};

bool init(vector<cars> &arr, char direct)
{
    for (auto i = 0; arr.size(); i++)
    {
        if (arr.at(i).dr == direct)
        {
            return true;
        }
    }
    return false;

}

char direct_shift(char e)
{
    if (e == 'N')
    {
        return 'E';
    }
    else if (e == 'E')
    {
        return 'S';
    }
    else if (e == 'S')
    {
        return 'W';
    }
    else if (e == 'W')
    {
        return 'N';
    }
    else
    {
        return '\0';
    }
}


int main() {

    vector <cars> keeper;
    queue <cars> que;

    char track;  //starting direction
    int car_num;    //starting car num

    string n;
    char d;
    int sec;
    cin >> track;
    cin >> car_num;

    while (cin >> n >> d >> sec) //takes the input if plate, direction and time
    {
        cars temp;
        temp.name = n;
        temp.dr = d;
        temp.t = sec;
        keeper.push_back(temp);
    }

    for (int i = 0; i < keeper.size(); i++) {
        cout << keeper[i].name << " " << keeper[i].dr << " " << keeper[i].t << endl;
    }  //checks if it all inputted it
    char curr_dir = track;

    while (not keeper.empty())
    {
        for (auto i = 0; i < keeper.size(); i++) {
        reset:
            if (init(keeper, curr_dir) == true)
            {
                if (keeper[i].dr == curr_dir) {
                    que.push(keeper.at(i)); //pushes vector at i into queue
                    keeper.erase(keeper.begin() + i); // deletes vector at index i
                    cout << que.front().name << " Going to " << que.front().dr << " at " << que.front().t << endl;
                    que.pop();
                    curr_dir = direct_shift(curr_dir);
                    break;
                }
            }
            else
            {
                curr_dir = direct_shift(curr_dir);
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, что у вас возникли проблемы из-за следующей функции:

bool init(vector<cars> &arr, char direct) {

  for (auto i = 0; arr.size(); i++) {
       if (arr.at(i).dr == direct) { 
            return true; 
        } 
   } return false; 

} 

arr.at(i) сгенерирует исключение out_of_range, если вы попытаетесь получить доступ к несуществующему индексу.Это означает, что вы должны гарантировать, что ваш вектор не пуст / не соответствует размеру, прежде чем вы получите доступ к индексу.

bool init(vector<cars> &arr, char direct) { 
     //the loop now checks for (!arr.empty()) 
         for (vector<cars>::size_type i = 0; i <arr.size(); ++i) { 
             if (arr.at(i).dr == direct) {
                  return true; } 
          } return false; 

} 
...