векторный индекс вне диапазона ошибки в C ++ - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь написать программу, которая принимает на вход n целых чисел и находит ту, которая встречается максимальное количество раз в данном входе. Я пытаюсь запустить программу для t случаев. Для этого я реализовал алгоритм сортировки типа подсчета (возможно, немного наивный), который подсчитывает количество вхождений каждого числа на входе. Если есть несколько чисел с одинаковым максимальным числом, мне нужно вернуть меньшее из них. Для этого я реализовал сортировку.
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю программу на Visual C ++, я получаю сообщение об ошибке, указывающее «векторный индекс вне диапазона». Под Netbeans он генерирует возвращаемое значение 1 и завершается. Пожалуйста, помогите мне найти проблему

   #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>


using namespace std;

int findmax(vector<int> a, int n)
{
    int i,ret;
    ret = 0;
    for ( i = 0; i <n; i++)
    {
        if (a[i] > ret) {
                ret = a[i]; 
        }
    }
    return ret;
}


int main() {
    int i = 0, j = 0, k = 0, n,m,r1,r2;
    vector<int> a;
    int t;
    vector<int> buff;

    cin>>t;
    while(t--) {

        cin>>n;
        a.clear();
        buff.clear();
        for ( i = 0; i < n; i++) {

            cin>>a[i];
        }

        sort(a.begin(),a.end());
        m = findmax(a,n);
        for ( j = 0; j < m+1; j++) {
            buff[a[j]] = buff[a[j]] + 1;
        }
        k = findmax(buff,m+1);

        for ( i = 0; i < m+1; i++) {
            if (buff[i] == k) {
                 r1 = i;
                 r2 = buff[i];
                 break;
            }
        }

        cout<<r1<<" "<<r2<<endl;
    }
    return 0;
}

Ответы [ 5 ]

5 голосов
/ 01 февраля 2012

После a.clear() вектор не имеет членов, и его размер равен 0.

Добавьте вызов к a.resize(n), чтобы сделать его подходящим размером.Вам также нужно изменить размер buff до любого необходимого размера.

3 голосов
/ 01 февраля 2012

эта строка виновна:

 cin>>a[i];

Вы должны использовать push_back:

  cin >> temp;
  a.push_back(temp);

или изменить размер (n) до:

    cin>>n;
    a.resize(n);
    for ( i = 0; i < n; i++) {
        cin>>a[i];
    }

тогда вам нужно передать ваш вектор по ссылке на findmax

int findmax(vector<int> &a, int n)
...
2 голосов
/ 01 февраля 2012
    for ( i = 0; i < n; i++) {

        cin>>a[i];
    }

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

2 голосов
/ 01 февраля 2012

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

a.clear();
a.resize(n);
buff.clear();
buff.resize(n);
2 голосов
/ 01 февраля 2012

Это не то, как вы заполняете массив.

cin>>a[i];

Вам необходимо использовать метод push_back() или предварительно выделить соответствующий размер.

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