template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator remove_copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
唯一的区别是
if (!pred(*first)) //copy if is if (pred(*first)) {
remove_copy_if可以使用
进行模拟copy_if(it1, it2, not1(pred));
那么为什么我们需要remove_copy_if?
答案 0 :(得分:4)
为了让您了解历史,更好的问题是,为什么我们需要copy_if
?
如果你看,remove_copy_if
在c++11之前就已经到了,而copy_if
在c++11首次亮相。
你是正确的,函数结果的反转就是将这两个结果分开,但正面更容易理解,因此引入了copy_if
。引用JaggedSpire's link:
这是经常要求的添加,在(例如)最新版的C ++编程语言中提到。它正式冗余,因为它只是
remove_copy_if
的反转:复制满足谓词p的所有元素与不复制满足!p
的所有元素相同。无论如何,它值得加入。首先,C ++并不是一种真正的函数式语言,并且将谓词转换为它的否定有时很尴尬。 其次,使用双重否定的解决方法并非令人不安。