Ошибка сегментации в C ++ - Векторы - PullRequest
0 голосов
/ 22 апреля 2020
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() 
{
    int a, b;
    cin>>a;
    vector<int> numbers;
    for(int i=0; i<a; i++)
    {
        cin>>b;
        numbers.push_back(b);
    }

    int c,d,e;
    cin>>c;
    numbers.erase(numbers.begin()+c-1);
    cin>>d>>e;
    numbers.erase(numbers.begin()+d-1, numbers.end()+e);

    cout<<numbers.size();
    for(int x : numbers)
        cout<<x<<" ";

    return 0;
}

Привет всем, я изучаю c ++ и пишу очень простую программу, но этот код выдает «Ошибка сегментации» как ошибку. Я действительно не мог понять, почему это происходит.

Спасибо.

1 Ответ

1 голос
/ 22 апреля 2020

Эта строка

numbers.erase(numbers.begin()+d-1, numbers.end()+e);

не может быть правильной. Увеличение итератора end никогда не даст вам действительного итератора. Не совсем понятно, что вы хотите сделать, но если вы хотите стереть элементы в диапазоне индексов [d,e), тогда это будет

numbers.erase(numbers.begin()+d, numbers.begin()+e);

Примечание: для первого не нужно +1, потому что первое включительно. И вы получаете итератор для e-го элемента, увеличивая итератор begin, а не итератор end (хорошо ... Я предполагаю, что общий подсчет на основе 0, ie, "первым" элементом является 0-й элемент;).

Кроме того, как уже упоминалось в комментариях, перед вызовом erase следует проверить, находятся ли введенные пользователем значения в диапазоне. erase не проверяет границы. Если вы передадите неверные итераторы, вы получите неопределенное поведение.

...