序列迭代器?提升中没有一个吗?

Arm*_*yan 13 c++ boost iterator

我不时感觉需要某种迭代器(除了前面这个问题的标题之外,我不能说出一个好名字).

假设我们有一个函数(或函数对象)将整数映射到类型T.也就是说,我们有一个数学序列的定义,但我们实际上并没有将它存储在内存中.我想用它做一个迭代器.迭代器类看起来像这样:

template <class F, class T>
class sequence_iterator : public std::iterator<...>
{
    int i;
    F f;
    public:
    sequence_iterator (F f, int i = 0):f(f), i(i){}
    //operators ==, ++, +, -, etc. will compare, increment, etc. the value of i.
    T operator*() const
    {
        return f(i);
    }    
};

template <class T, class F>
sequence_iterator<F, T> make_sequence_iterator(F f, int i)
{
    return sequence_iterator<F, T>(f, i);
}
Run Code Online (Sandbox Code Playgroud)

也许我天真,但我个人觉得这个迭代器会非常有用.例如,假设我有一个函数来检查数字是否为素数.我想计算区间[a,b]中素数的数量.我会这样做;

int identity(int i)
{
   return i;
}
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime);
Run Code Online (Sandbox Code Playgroud)

由于我发现了一些有用的东西(至少恕我直言),我肯定是积极的,它存在于boost或标准库中.我找不到它.那么,在推动中有这样的东西吗?.在非常不可能的事件中,实际上没有,那么我将写一个 - 在这种情况下,我想知道你的意见,我是否应该做iterator_category random_access_iterator_tag.我担心的是,这不是真正的RAI,因为operator*不会返回引用.

在此先感谢您的帮助.

Ale*_* C. 6

boost::counting_iteratorboost::transform_iterator应该做的伎俩:

template <typename I, typename F>
boost::transform_iterator<
    F,
    boost::counting_iterator<I>>
make_sequence_iterator(I i, F f)
{
    return boost::make_transform_iterator(
        boost::counting_iterator<I>(i), f);
}
Run Code Online (Sandbox Code Playgroud)

用法:

std::copy(make_sequence_iterator(0, f), make_sequence_iterator(n, f), out);
Run Code Online (Sandbox Code Playgroud)