Nav*_*een 63 c++ algorithm stl
在C++中没有std :: copy_if算法的具体原因是什么?我知道我可以使用std :: remove_copy_if来实现所需的行为.我认为它是在C++ 0x中出现的,但是一个简单的copy_if需要一个范围,一个输出迭代器和一个仿函数就可以了.它只是简单地错过了还是还有其他原因呢?
rlb*_*ond 27
Stroustrup说他们忘记了.它是在C++ 11中.
但是,您可以使用remove_copy_if
(实际应该被称为copy_if_not
)not1
.
只是为了完整性,如果有人用谷歌搜索他/她的方式来解决这个问题,应该提到现在(在C++ 11之后)有一个副本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);
});
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是一个事实还是一个自我延续的神话.如果有人能指出一个比互联网随机帖子的链接更可信的来源,我将不胜感激.
编写自己的东西很容易:
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));
}
Run Code Online (Sandbox Code Playgroud)
编辑:此版本适用于所有谓词:
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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14587 次 |
最近记录: |