Ошибка при использовании вектора: что (): вектор :: _ M_range_check - PullRequest
1 голос
/ 31 января 2020

Я начинающий программист и пытаюсь написать программу, которая запрашивает у пользователя следующее:

  • P - Печать номеров
  • A - Добавление номеров
  • M - отображение среднего числа
  • S - отображение наименьшего числа
  • L - отображение наибольшего числа
  • Q - выход

Пользователь должен набрать эти буквы (будь то строчные или прописные), чтобы работать с ним. Цель состоит в том, чтобы создать список чисел только с использованием вектора и выполнить вышеуказанные действия

Для Например, если я наберу p, он должен отобразить пустой список (если в списке нет номера) или отобразить числа в следующем формате: [1 2 3]

Применить этот же формат здесь для других вариантов

Так вот код, который я написал сам:

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

int main()
{
    int Count {1};
    char selection {};
    int Numbers {};
    double Sum {0};
    double Average {};
    int Minimum {};
    int Maximum {};
    vector <int> list;
    do {
        cout << "P - Print Numbers" << endl;
        cout << "A - Add Numbers" << endl;
        cout << "M - Display The Mean Of The Numbers" << endl;
        cout << "S - Display The Smallest Number" << endl;
        cout << "L - Display The Largest Number" << endl;
        cout << "Q - Quit" << endl;
        cout << "\nEnter Your Choice: ";
        cin >> selection;
        switch(selection){
            case 'P':
            case 'p':
                if(list.size() == 0){
                    cout << "\n[] - The List Is Empty" << endl;
                } else{
                    cout << "\n[ ";
                    for(size_t i{0}; i<=list.size(); ++i)
                        cout << list.at(i) << " ";
                    cout << "]" << endl;
                }
                break;
            case 'a':
            case 'A':
                cout << "\nEnter Your Number: ";
                cin >> Numbers;
                if (Count == 1){
                    Maximum = Numbers;
                    Minimum = Numbers;
                }
                if (Numbers > Maximum)
                    Maximum = Numbers;
                if (Numbers < Minimum)
                    Minimum = Numbers;
                list.push_back(Numbers);
                cout << "Added " << Numbers << endl;
                Count += 1;
                break;
            case 'm':
            case 'M':
                if (list.size() == 0)
                    cout << "Unable To Calculate The Mean - No Data" << endl;
                else {
                for (size_t j{0}; j<=list.size(); ++j){
                    Sum += list.at(j);
                    Average = Sum / list.size();
                }
                cout << "\nThe Mean Is : " << Average << endl;
                }
                break;
            case 's':
            case 'S':
                if (list.size() == 0)
                    cout << "Unable To Determine The Smallest Number - List Is Empty" << endl;
                else
                    cout << "\nThe smallest number is : " << Minimum << endl;
                break;
            case 'l':
            case 'L':
                 if (list.size() == 0)
                    cout << "Unable To Determine The Largest Number - List Is Empty" << endl;
                else
                    cout << "\nThe Largest number is : " << Maximum << endl;
                break;
            case 'q':
            case 'Q':
                cout << "Goodbye!!" << endl;
                break;
            default:
                cout << "Unknown Selection, Please Try Again!" << endl;
        }
    } while (selection != 'q' && selection != 'Q');
    return 0;
}

Проблема в том, что я могу успешно добавить номер, но когда я пытаюсь распечатать список, я получаю это:

    terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)

Теперь, как я уже сказал, я могу запустить это без каких-либо ошибок или предупреждений. d, чтобы изменить size_t на int, но я получил два предупреждения ... и я также использую .push_back() для вектора, поэтому у меня нет пустого вектора ...

Любая помощь было бы здорово .. Спасибо :)

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Сравнение меньше или равно в for (size_t j{0}; j<=list.size(); ++j) неверно.

Рассмотрим последнюю итерацию ... j будет равен list.size().

Вместо этого каноническая итерация по элементам списка:

    for (size_t i{0}; i < list.size(); ++i)
        std::cout << list[i] << " ";

As как показано выше, вы можете изменить list.at(i) на list[i], поскольку вы знаете, что индекс будет действительным.

Наконец, я бы предложил не использовать имя list для вашего вектора, так как это имя типа связанного списка в стандартной библиотеке C ++.

1 голос
/ 31 января 2020

Ошибка довольно очевидна: вы обращаетесь к элементу по индексу, выходящему за пределы диапазона [0; size ()).

for (size_t j{0}; j<=list.size(); ++j){
   ...
}

И другие места, где вы выполняете итерацию, как это.

Измените на j<list.size(), так как индексы массива основаны на 0 и go до, но не до включая size().

В следующий раз, когда вы столкнетесь с такой проблемой, вы можете использовать отладчик, чтобы увидеть, где именно возникло исключение и почему.

...