Максим уже предложил boost::filter_iterator
, но я предлагаю пойти еще дальше. Одни только буст-итераторы очень громоздки в использовании. Как правило, вы хотите фильтровать диапазоны, копировать диапазоны или диапазоны поиска. Для каждого повышающего итератора у нас есть служебная функция make_xxx_range, подобная следующей:
#include <boost/iterator/filter_iterator.hpp>
#include <boost/range/iterator_range.hpp>
template< class Range, class Pred >
boost::iterator_range< boost::filter_iterator< Pred, typename boost::range_iterator<Range>::type > >
make_filter_range( Range& rng, Pred p ) {
return boost::make_iterator_range( boost::make_filter_iterator(pred, boost::begin(rng), boost::end(rng)), boost::make_filter_iterator(pred, boost::end(rng), boost::end(rng)) );
}
Имея это, решение вашей проблемы тривиально:
#include <boost/lambda/lambda.hpp>
int main() {
std::vector<int> v;
// fill vector
std::vector<int> v2 = boost::copy_range< std::vector<int> >(
make_filter_range( v, boost::lambda::_1 > 5 );
}