簡體   English   中英

在C ++中刪除向量中的范圍元素

[英]Delete a range elements in a vector in C++

我正在嘗試刪除向量中的一些元素,這些元素由另一個索引向量指定。 我遇到了分段錯誤。 我得到分段錯誤的原因是我的向量的大小隨着元素被刪除而減少,所以看起來我試圖超過索引。 有人可以幫忙嗎? 提前致謝

#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;
}

正如你所說的矢量大小的變化,也要注意指數也會改變,所以你不會刪除你認為你的元素。 我可以建議對索引向量( std::sort )進行std::sort ,然后從最大的索引中刪除。 這樣,先前的索引不會被刪除之前的索引無效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM