我有一个向量V,我想存储此向量的哪些元素,我稍后将要删除。
为此,我使用了另一个向量Y来存储我想要删除的V元素的迭代器。所以我迭代Y来访问我需要在V中删除的元素的迭代器。
问题是当你从V中擦除元素时,Y中的所有迭代器(指向V的元素)都变得无效。
我找不到任何答案,但似乎是微不足道的,必须有一个简单的解决方法,不是吗?
答案 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)
。