我有一个向量index
,其中包含我要删除的元素的索引
来自向量words
。
vector<int> Index;
vector<int> words;
我尝试使用此方法,但我的程序在运行时崩溃了么? 发生了什么事?
for(int t1 = 0; t1 < index.size(); t1++)
{
words.erase(words.begin()+ index[t1])
}
谢谢。
答案 0 :(得分:3)
如果您没有看到如何声明和初始化words
和index
,就很难确定程序崩溃的原因。
然而,最有可能发生的是,从words
中删除元素后,并且在所有后续元素向左移动一个位置之后,index
中的索引可能会索引超出向量新端的位置。
当i
大于向量的大小时,评估words.begin() + i
将导致未定义的行为(在您的情况下表现为崩溃)。
如果您的索引向量按递增顺序排序,只需还原循环:
for(int t1 = index.size() - 1; t1 >= 0; --t1)
{
words.erase(words.begin() + index[t1]);
}
或者,您可以使用原始循环并按减少顺序对索引进行排序。
答案 1 :(得分:2)
尝试反向执行操作。删除后来的索引后,后续索引将变为无效。
我假设你的指数是有序的。如果没有,那么订购它们然后确保首先删除最大的索引。
答案 2 :(得分:2)
这里的问题是当你擦除矢量中的一些元素时,你正在更新矢量的大小。
请改为尝试:
for(int t1 = index.size()-1; t1 >= 0; --t1)
{
words.erase(words.begin()+index[t1])
}
答案 3 :(得分:0)
vector<int>a = {0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0}; vector<int>index; int t = 0; while(t < a.size() && a[t] != 1) { index.push_back(t); t = t + 1; } t = a.size()-1; while( t > 0 && a[t] != 1) { index.push_back(t); t = t - 1; } sort(index.begin(),index.end()); index.erase(std::unique(index.begin(), index.end()), index.end()); cout << "Before: "; for(int i = 0; i <a.size();i++) { cout << a[i] <<" "; } cout << endl; int counter = 0; for(int i = 0; i < index.size();i++) { a.erase(a.begin() + (index[i]-counter)); counter = counter + 1; } cout <<"After: "; for(int i = 0; i < a.size();i++) { cout << a[i] <<" "; }