Получение ошибки сегментации (объявление вектора)

Узнайте максимальный подмассив неотрицательных чисел из массива. Подмассив должен быть непрерывным. То есть подмассив, созданный путем выбора второго и четвертого элемента и пропуска третьего элемента, недопустим.

Максимальный подмассив определяется в терминах суммы элементов в подмассиве. Под-массив A больше, чем под-массив B, если сумма (A) > сумма (B).

Это мое решение:

vector<int> Solution::maxset(vector<int> &A) {
// Do not write main() function.
// Do not read input, instead use the arguments to the function.
// Do not print the output, instead return values as specified
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details

    vector <int> bla;
    int sum[100]={0};
    int k = 0;
    int j = 1;

    for (int i =0; i < A.size(); i++){
        if (A[i] > -1){
            sum[k] = A[i] + sum[k];
        }
        else {
            k++;
        }
    } 

    cout<<sum[0]<<" ";
    cout<<sum[1]<<" ";
    cout << sum[2] << " ";

    int s = 0;

    for (int i =0; i< 100; i++){
        if (s < sum[i]){
            s = sum[i];
            k = i;
        }
    }

    cout << s;

    int count = 0;
    for (int i =0; i < A.size(); i++){
        if (A[i] < 0) {
            count ++;
        }

        if (count == k) {
            int j = i+1;
            int x = 0;
            while (A[j] > 0 && j< (A.size()-1)) {
                //  bla[x] = A[j];
                x++;
                j++;
            }
        }
    } 

    return bla;
}

Если я раскомментирую строку bla[x] = A[j], я получу ошибку сегментации. Может кто-нибудь объяснить, как понять эту ошибку? Я где-то читал, что в стеке недостаточно места. Я не понимаю, как. Спасибо

1 ответ

Решение

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

std::vector<int> vecInt(10);
for(int i(0); i < vecInt.size(); i++)
    vecInt[i] = i;

Или вы можете объявить вектор размером 0:

std::vector<int> vecInt;
vecInt[0] = 10; // segfault

Потому что вы пытаетесь хранить значения в нераспределенном пространстве.

Для решения такой проблемы используйте push_back хранить и pop очистить:

Итак, ваш пример может быть таким:

while (A[j] > 0 || j< (A.size()-1)) {
     //  bla[x] = A[j];
     bla.push_back(A[j]);
     x++;
     j++;
}
Другие вопросы по тегам