为什么我们需要remove_copy_if?

时间:2017-01-25 20:10:15

标签: c++

根据http://www.cplusplus.com

中的代码
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?

1 个答案:

答案 0 :(得分:4)

为了让您了解历史,更好的问题是,为什么我们需要copy_if

如果你看,remove_copy_if之前就已经到了,而copy_if首次亮相。

你是正确的,函数结果的反转就是将这两个结果分开,但正面更容易理解,因此引入了copy_if。引用JaggedSpire's link

  

这是经常要求的添加,在(例如)最新版的C ++编程语言中提到。它正式冗余,因为它只是remove_copy_if的反转:复制满足谓词p的所有元素与不复制满足!p的所有元素相同。无论如何,它值得加入。首先,C ++并不是一种真正的函数式语言,并且将谓词转换为它的否定有时很尴尬。   其次,使用双重否定的解决方法并非令人不安。