为什么没有std :: remove的非破坏性版本?

时间:2014-10-16 17:32:08

标签: c++ c++-standard-library

一种算法,通过将它们移动到最后并且不保留它们的顺序而非破坏性地“移除”范围中的元素,同时保留未被“移除”的元素的顺序可能是有用的,并且可以在线性时间内运行而没有辅助空间。实施很简单:

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的优点是不需要右侧稳定,允许线性时间实现而无需额外空间。

为什么这不在标准库中?我认为它足够有用且足够适合那里。

0 个答案:

没有答案
相关问题