为什么没有std :: move_if算法?

Adr*_*ian 4 c++ c++17

我已经在Internet上看到了几个描述使用std::copy_ifwith的地方std::make_move_iterator,但是如果将迭代器作为正向迭代器,则会导致有效但未指定(VBU)的对象散布在源容器周围。

拥有一个std::move_if算法使得如果移动一个对象会更好,那么它将生成的VBU对象移动到范围的末尾,就像在std::remove_if算法中所做的那样,将所有VBU对象整合在一起可以删除或重新分配它们?

Bar*_*rry 10

如果move_if作为算法存在,则必须指定为:

template <class InputIt, class OutputIt, class UnaryPredicate>
OutputIt move_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred)
{
    return std::copy_if(std::make_move_iterator(first), std::make_move_iterator(last),
        d_first, pred);
}
Run Code Online (Sandbox Code Playgroud)

我们已经习惯于将复制和移动之间的区别考虑为仅仅是我们是否关心源对象的问题。我们还在吗?复制。不是吗 移动。有move_if(f, l, d, pred)做一些语义不同的copy_if(f, l, d, pred)似乎天生混乱且容易出错的-因为它不可避免的用法是做一个“复制我们不关心源了。”

但是,然后-您或多或少地在问题中描述了该算法的问题。我什么时候用这个?我最终会得到一个源范围,其中某些元素是从中移出的,而其他元素则不是。这样的范围我该怎么办?我无法以某种方式合并它们,因为我不知道它们是什么。移动这些元素后面有用的-我们有算法:remove_if

基本上,在这一点上,我只能使用source范围销毁它。也许这很有用。也许这足够有用,甚至值得在中使用该算法std::。我不知道。但是move_if绝对需要做与copy_if

  • 在您的答案中实现的“move_if”的另一个警告是谓词需要通过引用获取其参数,否则,可能要移动的值将被移动到谓词参数而不是输出范围中。 (2认同)