存储要擦除的矢量元素

  • 本文关键字:元素 擦除 存储 c++
  • 更新时间 :
  • 英文 :


我有一个向量V,我想存储这个向量的哪些元素,我以后必须删除。

为了做到这一点,我使用了另一个向量Y来存储我想要删除的V元素的迭代器。因此,我遍历Y以访问我需要在V.中删除的元素的迭代器

问题是,当您从V中删除元素时,Y中的所有迭代器(指向V的元素)都将无效。

我找不到任何答案,但这似乎很琐碎,必须有一个简单的解决方法,不是吗?

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

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

指向位置(或第一个)和beyond无效,所有迭代器、指针和对位置(或第一个)之前的元素保证保持引用与他们在通话前提到的元素相同。

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

因此,如果对Y的元素(迭代器)进行排序,您可以向后迭代Y并删除V中的相应元素。这是有效的,因为当您删除V中元素时,只有V中后面元素的迭代器才会无效。

这是关于复杂性的。

您可以将元素从较高索引擦除到较低索引,在这种情况下,您的方法会起作用,但每次擦除向量的元素时,它后面的元素都会被重新定位。它的复杂性与被擦除元素后面的元素数量成线性关系,所以我预计会有一种二次complexity,或O(number_of_elements * number_of_elements_to_be_erased)

如果删除的数量很高,并且要删除的元素的索引在整个范围内或多或少地均匀分布,那么从复杂性的角度来看,更好的解决方案是对"要删除的单元"进行补充。相反,它将是"要保留的元素",您可以将应该保留的元素复制到新数组中,并将其分配给旧数组。这是向量中元素数量O(number_of_elements)线性

更好的是,如果您对实现有完全的控制权,并且可以将std::vector更改为std::list,那么您可以完全按照您所描述的进行其余操作,而不会产生不良副作用。在这种情况下,擦除也是有效的,在常量时间内完成,因此整个操作是O(number_of_elements_to_be_erased)

最新更新