#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 ++并编写一个非常简单的程序,但是此代码将"分段错误"作为错误给出。我真的想不通为什么会这样。
谢谢。
此行
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 的计数,即"第一个"元素是第 0 个元素;)。
此外,如注释中所述,在调用erase
之前,您应该检查用户输入的值是否在范围内。erase
不进行边界检查。如果传递无效的迭代器,则会得到未定义的行为。