有时我需要迭代容器的一部分元素,或者只想提取它们并忽略其余部分。我最终使用boost::range::adaptors::filtered
创建这个延迟集合。
for(auto&& i : container | filtered(predicate)) {
// .. do stuff
}
STL中缺少类似Ruby的collect算法的原因是什么(我们只有copy_if,并不相同)?或者有没有使用它的任何理由?
一种可能的实现方式如下:
template<class Container, class Predicate>
Container collect(Container&& c, Predicate&& p) {
Container n;
for(auto&& i : c) {
if(p(i)) {
n.push_back(i);
}
}
return n;
}
但是一个lazy_collect
也可能很有用,以避免拷贝。
下面的所有答案都很棒。我希望我可以标记它们中的所有内容。我之前不知道std::back_inserter
。现在收集东西就像这样简单:
boost::copy( orig | filtered(predicate), std::back_inserter(collection));
copy_if
不同的时候发了帖子。当使用copy_if
时,你需要事先知道需要多少空间,这会导致n container(count_if(old,predicate)); std::copy_if(old,n,predicate);
。 - gnzlbgback_inserter
来绕过先验大小知识要求。 - Angew is no longer proud of SO