从std :: vector中删除元素时出现运行时错误

时间:2013-06-14 10:23:36

标签: c++ vector erase

我有一个向量index,其中包含我要删除的元素的索引 来自向量words

vector<int> Index;
vector<int> words;

我尝试使用此方法,但我的程序在运行时崩溃了么? 发生了什么事?

for(int t1 = 0; t1 < index.size(); t1++)
{
        words.erase(words.begin()+ index[t1])
}

谢谢。

4 个答案:

答案 0 :(得分:3)

如果您没有看到如何声明和初始化wordsindex,就很难确定程序崩溃的原因。

然而,最有可能发生的是,从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] <<"   ";
}