【发布时间】:2017-06-26 04:29:17
【问题描述】:
虽然有几十个关于remove_if + erase for vector的问题。 我找不到这种动作的表现。 当我写:
myVector.erase(remove_if(myVector.begin(),
myVector.end(),
some_predicate), myVector.end());
remove if 将返回一个迭代器,指向最后一个相关项 + 1(我们称之为 X)。 我相信这会在 O(n) 内发生。
但是擦除将如何工作?
- 如果擦除尝试从 X 删除到 myVector.end(),它将是 O(n^2),因为它会导致将向量复制到新位置,并且会有 O(n) 新分配从堆中。
- 但如果它将从 myVector.end() 删除到 X,它可以在 O(n) 内完成,更重要的是不会分配新内存(我试图避免这种情况)。
谢谢。
【问题讨论】:
-
std::remove_if()的复杂性是 正如in the documentation 所述,正是谓词的 std::distance(first,last) 应用。 -
vector::erase在这种情况下不会导致任何重新分配。 -
"如果擦除将尝试从 X 删除到 myVector.end(),它将是 O(n^2)".... 究竟如何?
-
@OopsUser 从向量中间移除不会导致重新分配!使向量更小不需要更多内存!您不会向后移动要删除的元素,因为您将要删除它们。您将那些 在 这些元素之后的元素向后移动,但这仍然不会重新分配,并且当您执行
v.erase(X, v.end())时,之后 没有任何 元素,所以您摧毁他们。 -
@OopsUser:这不是
vector.erase(x, v.end())的工作方式。 @Jonathan 的回答很好地解释了它是如何工作的!
标签: c++ performance vector std erase