Я считаю, что многие функциональные задачи могут быть решены путем объединения boost.iterators. Для этого у него есть filter_iterator .
Скажем, у вас есть вектор натуральных чисел и функция, которую вы хотите применить к паре итераторов, которая должна видеть только отфильтрованный вектор только с нечетными числами:
#include <algorithm>
#include <vector>
#include <iterator>
#include <numeric>
#include <iostream>
#include <boost/iterator/filter_iterator.hpp>
template<typename Iter>
void do_stuff(Iter beg, Iter end)
{
typedef typename std::iterator_traits<Iter>::value_type value_t;
copy(beg, end, std::ostream_iterator<value_t>(std::cout, " "));
std::cout << '\n';
}
struct is_even {
bool operator()(unsigned int i) const { return i%2 == 0; }
};
int main()
{
std::vector<unsigned int> v(10, 1);
std::partial_sum(v.begin(), v.end(), v.begin()); // poor man's std::iota()
// this will print all 10 numbers
do_stuff(v.begin(), v.end());
// this will print just the evens
do_stuff(boost::make_filter_iterator<is_even>(v.begin(), v.end()),
boost::make_filter_iterator<is_even>(v.end(), v.end()));
}