1

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

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

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

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

谢谢你。

4

4 回答 4

3

如果不看你如何声明和初始化wordsindex.

但是,最有可能发生的情况是,在从 中删除一个元素words之后,并且在所有后续元素都向左移动了一个位置之后,其中的索引index可能会索引超出向量新端的位置。

i大于向量的大小时,评估words.begin() + i将导致未定义的行为(在您的情况下表现为崩溃)。

如果您的索引向量按升序排序,只需还原您的循环:

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

或者,您可以使用原始循环并按降序对索引进行排序。

于 2013-06-14T10:27:01.763 回答
2

尝试反向执行操作。删除后续索引后,后续索引将失效。

我假设您的索引是有序的。如果没有,则订购它们,然后确保首先删除最大的索引。

于 2013-06-14T10:25:31.757 回答
2

这里的问题是,当您擦除其中的一些元素时,您正在更新向量的大小。

试试这个:

for(int t1 = index.size()-1; t1 >= 0; --t1)
{
    words.erase(words.begin()+index[t1])
}
于 2013-06-14T10:27:17.587 回答
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] <<"   ";
}
于 2013-06-14T11:39:27.723 回答