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

时间:2009-09-19 15:53:37

标签: c++ algorithm stl

在C ++中没有使用std :: copy_if算法的具体原因吗?我知道我可以使用std :: remove_copy_if来实现所需的行为。我认为它是在C ++ 0x中出现的,但是一个简单的copy_if需要一个范围,一个输出迭代器和一个仿函数就可以了。它只是简单地错过了还是还有其他原因呢?

6 个答案:

答案 0 :(得分:41)

根据Stroustrup的“The C ++ Programming Language”,这只是一个过度的观点。

(作为引用,同样的问题在提升邮件列表中得到了解答:copy_if

答案 1 :(得分:27)

Stroustrup说他们忘记了。它在C ++ 11中。

但是,您可以使用remove_copy_if(实际上应该称为copy_if_not)和not1

答案 2 :(得分:9)

为了完整起见,如果有人用谷歌搜索这个问题的方式,应该提到现在(发布C ++ 11)一个copy if算法。它的行为与预期一致(将某个谓词返回true的范围内的元素复制到另一个范围)。

典型的用例是

std::vector<int> foo{ 25, 15, 5, -5, -15 };
std::vector<int> bar;

// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), 
            [](int i){return !(i<0);
          });

答案 3 :(得分:7)

Multiple sources indicate意外遗漏了STL。

然而,我不确定这是一个事实还是一个自我延续的神话。如果有人能指出一个比互联网随机帖子的链接更可信的来源,我将不胜感激。

答案 4 :(得分:7)

编写自己的内容很容易:

template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
                       OutputIterator result, Predicate pred)
{
  return std::remove_copy_if(first,last,result,std::not1(pred));
}

编辑:此版本适用于所有谓词:

template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
                       OutputIterator result, Predicate pred)
{
  while(first!=last)
  {
    if(pred(*first))
        *result++ = *first;
    ++first;
  }
  return result;
}

答案 5 :(得分:1)

为了完整起见,我会在boost::algorithm::copy_if中使用std::copy_if为那些无法使用c ++ 11版本(如我)的人添加boost/algorithm/cxx11/copy_if.hpp。时间:

#if __cplusplus >= 201103L
//  Use the C++11 versions of copy_if if it is available
using std::copy_if;         // Section 25.3.1
#else

示例:

#include <boost/algorithm/cxx11/copy_if.hpp>
#include <boost/assign/list_of.hpp> // for 'list_of()'
#include <boost/foreach.hpp>

#include <iostream>
#include <vector>
#include <iterator>

struct Odd
{
  bool operator()(int n)
  {
    return n & 1;
  }
};

int main()
{
  std::vector<int> v = boost::assign::list_of(0)(1)(2)(3)(4);
  BOOST_FOREACH(int i, v)
    std::cout << i << ' ' ;

  std::vector<int> out;
  boost::algorithm::copy_if(v.begin(), v.end(), std::back_inserter(out), Odd());

  std::cout << std::endl;

  BOOST_FOREACH(int i, out)
    std::cout << i << ' ' ;

}

输出:

0 1 2 3 4 
1 3