Выход за границы в векторе

250
26 декабря 2017, 17:17

Имеется код:

struct St
{
    string Name;
    int math;
    int phys;
    int inf;
    int chem;
    int dateOfBirth;
    int group;
    double ball;
} Students;
void showNeedableStudents() {
    vector <St> v;
    v.reserve(10);
    ifstream file1("list.txt");
    ofstream file2("result.txt");
    cout << "Enter the needable group: " << endl;
    int input_group = input();
    cout << "Enter the math mark u want: " << endl;
    int input_math = input();
    cout << "Enter the phys mark you need: " << endl;
    int input_phys = input();
    cout << endl;
    int amount = 0;
    int i = 0;
    cout << "\t\tFound students:" << endl;
    while (file1 >> Students.Name >> Students.math >> Students.inf
        >> Students.phys >> Students.chem >> Students.dateOfBirth
        >> Students.group >> Students.ball) {
        if (Students.group == input_group && Students.math >= input_math && Students.phys >= input_phys) {
            amount++;
            v.at(i).Name = Students.Name;
            v.at(i).math = Students.math;
            v.at(i).inf = Students.inf;
            i++;
        }
    }
    for (i = 0; i < v.size(); i++) {
        cout << Students.Name << endl;
    }
    if (amount == 0) {
        cout << "There are no students with such marks in group!" << endl;
    }

    file1.close();
    file2.close();
}
double input() {
    int a = 0;
    while (true) {
        cin >> a;
        if (!cin.good()) {
            cout << "Wrong input. Please try again!" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        else break;
    }
    return a;
}

Задача - считывание данных из файла в вектор структур. Однако при выполнении, выдаёт исключение std::out_of_range. В чём ошибка?

Answer 1

std::vector::reserve только увеличивает емкость вектора, но не "размер". И это не дает права обращаться к первому или второму элементу. Если заменить на resize, то все скорее всего заработает сразу.

но есть лучше способ. Вот этот код

v.at(i).Name = Students.Name;
v.at(i).math = Students.math;
v.at(i).inf = Students.inf;
i++;

заменить на

v.push_back(Students);
i++;
READ ALSO
При преобразовании String с дробными числами теряется информация

При преобразовании String с дробными числами теряется информация

Столбец excel содержит числа в диапазоне от 1 до 00001

277
Фатальная ошибка libgdx

Фатальная ошибка libgdx

Во время выполнения кода:

239
Можно ли с помощью shell открыть закладку chrome apk?

Можно ли с помощью shell открыть закладку chrome apk?

Есть ли быстрый способ запустить командно одну из закладок Google Chrome?

306