我正在尝试删除向量中的一些元素,这些元素由另一个索引向量指定。我遇到了分段错误。我得到分段错误的原因是我的向量的大小随着元素被删除而减少,所以看起来我试图超过索引。有人可以帮忙吗?提前致谢
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a = 5, b = 10 , c = 20, d = 30, e = 40 , f = 50;
vector<int> vec;
vec.push_back(a);
vec.push_back(b);
vec.push_back(c);
vec.push_back(d);
vec.push_back(e);
vec.push_back(f);
vector<int> index_2_b_el;
index_2_b_el.push_back(1); //delete b
index_2_b_el.push_back(3); //delete d
index_2_b_el.push_back(4); //delete e
for(int i=0; i<index_2_b_el.size(); i++)
{
vec.erase(vec.begin() + index_2_b_el[i]);
// "b", "d" and "e" should be deleted
}
for(int i=0; i<vec.size(); i++)
{
cout<< "vec: "<< vec[i]<<endl;
// "a", "c" and "f" should remain
}
return 0;
}
答案 0 :(得分:3)
如你所说,矢量的大小发生变化,同时注意指数也会发生变化,所以你不会删除你认为的元素。我可以建议对索引向量(std::sort
)进行排序,然后从最大的索引中删除。这样,以前的索引不会因之前的删除而失效。
答案 1 :(得分:-1)
vec.begin() + index_2_b_el[i]
是一个interator并擦除使擦除元素的所有迭代器以及它们之间的元素和容器末尾无效的所有迭代器无效。过去的迭代器也会失效。
因此,首次删除后,vec.begin() + index_2_b_el[1]
和vec.begin() + index_2_b_el[2]
不再有效
最佳解决方案是使用Erase-remove_idiom