存储要删除的矢量元素

时间:2013-07-03 12:12:35

标签: c++

我有一个向量V,我想存储此向量的哪些元素,我稍后将要删除。

为此,我使用了另一个向量Y来存储我想要删除的V元素的迭代器。所以我迭代Y来访问我需要在V中删除的元素的迭代器。

问题是当你从V中擦除元素时,Y中的所有迭代器(指向V的元素)都变得无效。

我找不到任何答案,但似乎是微不足道的,必须有一个简单的解决方法,不是吗?

4 个答案:

答案 0 :(得分:5)

使用V.erase(std::remove_if(V.begin(), V.end(), MyPredicate()), V.end())

答案 1 :(得分:3)

您可以使用std::vector<unsigned> indices存储每个元素的索引值。

答案 2 :(得分:2)

  

指向位置(或第一个)的迭代器,指针和引用   使用所有迭代器,指针和引用使得超出无效   位置(或第一)之前的元素保证继续引用   在电话会议之前他们指的是相同的元素。

http://www.cplusplus.com/reference/vector/vector/erase/

因此,如果Y的元素(迭代器)被排序,你可以向后迭代Y并删除V中的相应元素。这是有效的,因为当你擦除V中的元素时,只有V中后面元素的迭代器才会失效。 / p>

答案 3 :(得分:0)

这是关于复杂性的。

您可以删除从较高索引到较低索引的元素,在这种情况下,您的方法将起作用,但每次擦除向量的元素时,其后面的元素将被重新定位。这在复杂元素之后的元素数量上具有线性复杂性,因此我希望有一些二次复杂性,或O(number_of_elements * number_of_elements_to_be_erased)

如果删除的数量很高,并且要擦除的元素的索引在整个范围内或多或少地均匀分布,从复杂性的角度来看,更好的解决方案是在“元素的补充”上工作。删除”。相反,它将是“要保留的元素”,您将复制应该保留到新数组并将其分配给旧数组的元素。这是向量中{@ 1}}元素数量的线性

更好的是,如果你完全控制了实现并且可以为std :: list更改std :: vector,你可以完全按照你的描述继续进行其余操作,没有不良副作用。在这种情况下,擦除也很有效,在常量时间内完成,因此整个操作都是O(number_of_elements)