时不时地我需要遍历容器元素的一个子集,或者只是想提取它们而忽略其余部分。我最终boost::range::adaptors::filtered
用来创建这个惰性集合。
for(auto&& i : container | filtered(predicate)) {
// .. do stuff
}
STL中缺少收集算法(如Ruby的收集)是否有原因(我们只有不一样的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;
}
但 alazy_collect
也可能有助于避免复制。
下面的所有答案都很棒。我希望我可以标记所有这些。我不知道std::back_inserter
。收集东西现在很容易:
boost::copy( orig | filtered(predicate), std::back_inserter(collection));