我在互联网上看到了一些地方,它们用std::copy_if
和std::make_move_iterator
来描述,但是如果将迭代器作为正向迭代器,则会导致有效但未指定(VBU )分散在源容器周围的对象。
最好有一个std::move_if
算法,这样如果移动了一个对象,那么它将把生成的VBU对象移动到范围的末尾,就像在{{ 1}}算法,将所有VBU对象合并在一起,以便可以擦除或重新分配它们?
答案 0 :(得分: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);
}
我们非常习惯于将复制和移动之间的区别仅仅考虑我们是否关心源对象。我们还在吗?复制。不是吗移动。 move_if(f, l, d, pred)
与copy_if(f, l, d, pred)
做一些明显不同的事情似乎天生就令人困惑并且容易出错-因为它的不可避免的用法是在“我们不在乎的地方进行复制关于来源了。”
但是,在您的问题中,您或多或少地描述了该算法的问题。我什么时候用这个?我最终会得到一个源范围,其中某些元素是从中移出的,而其他元素则不是。这样的范围我该怎么办?我无法以某种方式合并它们,因为我不知道它们是什么。将那些元素移到后面的 很有用-我们 do 拥有该算法:remove_if
。
基本上,在这一点上,我只能对源范围进行破坏。也许这很有用。甚至足以在std::
中使用此算法。我不知道。但是move_if
肯定需要做与copy_if
相同的事情。