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
'Programing' 카테고리의 다른 글
Bower의 bower.json에서 "무시"하시겠습니까? (0) | 2020.11.25 |
---|---|
C에서 double이 C ++보다 소수를 더 적게 인쇄하는 이유는 무엇입니까? (0) | 2020.11.25 |
Django, 모델 메서드에서 쿼리 필터링 (0) | 2020.11.25 |
여러 인수가있는 필터와 장고의 체인 필터의 차이점 (0) | 2020.11.25 |
MVCS-모델보기 컨트롤러 서비스 (0) | 2020.11.25 |