Programing

std :: copy_if 알고리즘이없는 이유는 무엇입니까?

lottogame 2020. 11. 25. 07:27
반응형

std :: copy_if 알고리즘이없는 이유는 무엇입니까?


C ++에서 std :: copy_if 알고리즘을 사용하지 않는 특별한 이유가 있습니까? std :: remove_copy_if를 사용하여 필요한 동작을 수행 할 수 있다는 것을 알고 있습니다. 나는 그것이 C ++ 0x로오고 있다고 생각하지만 범위, 출력 반복기 및 펑터를 취하는 간단한 copy_if가 좋았을 것입니다. 단순히 놓친 것입니까 아니면 다른 이유가 있습니까?


Stroustrup의 "The C ++ Programming Language"에 따르면 이는 단지 감독 일뿐입니다.

(인용으로, 같은 질문이 boost mail-lists : copy_if )


Stroustrup은 그들이 그것을 잊었다 고 말합니다. C ++ 11에 있습니다.

그러나 대신 함께 사용할 수 있습니다 remove_copy_if(실제로 호출해야 함 copy_if_not) not1.


그냥 완성도, 경우에 누군가가이 질문에 그 / 그녀의 방법을 구글의, 이제 (포스트 C ++ 11)이 언급되어야한다 복사하면 알고리즘입니다. 예상대로 작동합니다 (일부 조건자가 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);
          });

여러 소스 실수로 STL에서 제외 되었음을 나타냅니다 .

그러나 그것이 사실인지 아니면 자기 영속적 인 신화인지는 잘 모르겠습니다. 누군가가 인터넷의 임의 게시물에 대한 링크보다 더 신뢰할 수있는 출처를 지적 해 주시면 감사하겠습니다.


직접 작성하는 것은 매우 쉽습니다.

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;
}

완전성을 위해 boost::algorithm::copy_if다음과 같은 경우에 사용할 C ++ 11 버전 (나와 같은)을 사용할 수없는 사람들을 위해 그 향상을 추가 boost/algorithm/cxx11/copy_if.hpp할 것입니다 std::copy_if.

#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 

참고 URL : https://stackoverflow.com/questions/1448817/why-there-is-no-stdcopy-if-algorithm

반응형