gpt4 book ai didi

c++11:从 vector 中删除多次出现。哪个是最佳实践?

转载 作者:行者123 更新时间:2023-11-27 22:48:17 26 4
gpt4 key购买 nike

我知道擦​​除会自动向前移动迭代器,因此在删除多次出现时我需要避免这种情况,以便我可以比较连续的元素。这就是我通常这样做的原因:

auto i = vect.begin();
while (i!=vect.end())
if (*i==someValue)
vect.erase(i);
else
++i;

但我想知道我是否也可以使用 for 循环来完成它,就像这样:

for (auto i=vec.begin(); i!=vec.end(); ++i)
if (*i==someValue){
vec.erase(i);
--i;
}

--i 部分看起来有点奇怪,但它确实有效。那会是不好的做法吗?糟糕的代码?容易出错?或者使用任何一个选项都是正确的?

谢谢。

最佳答案

使用删除和删除成语:

auto new_end = std::remove(v.begin(), v.end(), some_value);
v.erase(new_end, v.end());

上面的代码复杂度为 O(n),如果没有来自 C++17 的数据竞争,它可以并行执行

template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt remove( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value );

或使用 parallelism TS

您的代码有问题,因为来自 vector.modifiers#3

Effects: Invalidates iterators and references at or after the point of the erase

标准说迭代器是无效的


然而,实际上,大多数实现都将迭代器指向旧节点,即现在的 end 如果它是最后一个元素或下一个元素,那么您的代码的复杂度为 O (n2) 因为它会循环 n 次并花费 n 来移动数据。它也不能并行执行。

关于c++11:从 vector 中删除多次出现。哪个是最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40755402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com