C++ 中的分段错误 - 向量

Segmentation Fault in C++ - Vectors

#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++ 并编写了一个非常简单的程序,但是这段代码给出了 "Segmentation Fault" 作为错误。我真的不明白为什么会这样。

谢谢。

这一行

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

不可能是正确的。递增 end 迭代器永远不会为您提供有效的迭代器。目前还不太清楚你想做什么,但如果你想删除索引范围内的元素 [d,e) 那么那将是

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

注意:第一个不需要 +1,因为第一个包含在内。通过递增 begin 迭代器而不是 end 迭代器,您可以获得第 e 个元素的迭代器(好吧......我假设常见的基于 0 的计数,即 "first"元素是第0个元素;).

此外,如评论中所述,在调用 erase 之前,您应该检查用户输入的值是否在范围内。 erase 不进行边界检查。如果你传递无效的迭代器,你会得到未定义的行为。