ときどき、コンテナーの要素のサブセットを反復処理する必要があるか、単にそれらを抽出して残りを無視したいことがあります。私は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));