一种算法,通过将它们移动到最后并且不保留它们的顺序而非破坏性地“移除”范围中的元素,同时保留未被“移除”的元素的顺序可能是有用的,并且可以在线性时间内运行而没有辅助空间。实施很简单:
template <typename ForwardIterator, typename UnaryPredicate>
ForwardIterator nd_remove_if(ForwardIterator head, ForwardIterator last, UnaryPredicate pred)
{
using std::swap;
ForwardIterator swap_head = head;
while(head != last)
{
while(swap_head != last && !pred(*swap_head))
++swap_head;
if(swap_head == last)
break;
if(!pred(*head))
swap(*head, *swap_head);
else
++swap_head;
++head;
}
return head;
}
基本上,它是一个对左侧稳定但对右侧不稳定的分区。它优于std::stable_partition
的优点是不需要右侧稳定,允许线性时间实现而无需额外空间。
为什么这不在标准库中?我认为它足够有用且足够适合那里。