c – 使用迭代器行为生成函子

前端之家收集整理的这篇文章主要介绍了c – 使用迭代器行为生成函子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个问题,这可能是以前被问过的,因为我想我想要的是相当多的人想要的东西.然而,我无法想出任何表达方式,将返回我想要的搜索(不是谷歌,而不是在这里).所以也许这里的答案只是用来描述我的意思的单一术语.

我想要实现的是大致如下:

>它可以使用functor struct / class并生成一个值序列
对于基于函子的函数的所述函子.应该可以使用状态函数,即应该可以在状态a中实例化一个函子,并让它运行,直到它处于状态b,生成值的范围{f(a),f(a 1) …,f(b)},其中f(a 1)表示由f表示的系列中的下一个项目.
它的行为就像一个迭代器,即它可以被传递而不是一个迭代器.用值填充向量.

我认为这个名字应该是生成器或生成迭代器,因为这是它的作用,但是我一直非常失败地找到与该术语有关的东西.我写了我自己的实现,但它有它的问题,我想问,如果有这样的事情,然后再付出更多的努力.

为了保存你粘贴所有后续代码的工作,如果你想尝试这个,我把它放在ideone.我认为运行代码后,它是很清楚它是做什么的.

我当前的实现看起来像这样(fyi这是一个缩写版本,其中一些东西像 – 和 – 缺少,所以是的,我实现它们,因此它可以至少作为双向迭代器,我也有一个[]函数,所以我想到使它random_access.):

template <class F>
class generator{
public:
//typedefs required for iterator-use
typedef typename F::value_type value_type;
typedef typename F::step_type step_type;
typedef value_type * pointer;
typedef value_type & reference;
typedef typename F::size_type size_type;
typedef typename F::difference_type difference_type;
typedef std::bidirectional_iterator_tag iterator_category;

generator(value_type init,step_type step) : t(init),step(step){}

generator<F> &operator++() {
    t += step; return *this;
}

generator<F> &
operator+=(size_type n)
{
    t += n * step;
    return *this;
}

generator<F>
operator+(size_type n)
{
    return generator(*this) += n;
}

value_type operator*() const {
    return f(t);
}

value_type operator*() const {
    return f(t);
}

friend bool operator==(const generator<F> &lhs,const generator<F> &rhs){
    return lhs.t == rhs.t;
}
friend bool operator!=(const generator<F> &lhs,const generator<F> &rhs){
    return !(lhs == rhs);
}
private:
    value_type t;
    value_type step;
    F f;
};

我使用不同的模板来尽可能容易地提供typedef:

template <typename T>
struct simple_generator_function
{
    typedef T value_type;
    typedef T step_type;
    typedef T difference_type;
    typedef size_t size_type;
};

现在这两个工作与一个具体的“生成器”一样这样:

template <typename T>
struct square_generator : public simple_generator_function<T> {

    T operator()(T t) const{
        return t * t;
    }
};

int main(void) {
    using int_sqg = generator<square_generator<int>>;
    //starting at initial value 1 take steps of size 4
    int_sqg gen(1,1);
    //fill with all before inital + n * step
    vector<int> v(gen,gen+10);
    copy(begin(v),end(v),ostream_iterator<int>(cout,","));
    cout << '\n';
}

长篇小说:有没有一个提升或其他图书馆,它以一种可靠的方式提供这一点,这种迭代器/函子混合的名称是什么?

编辑1:

我认为任何解决方案最多只能是一个InputIterator,因为根据我的研究,所有其他迭代器都必须返回一个引用
operator *(),在这种情况下是不合适的.很可能的是,编写一个将普通函数转换为InputIterator的模板.

状况:答案到目前为止都是好的,但是在提出之前我已经有了一些思考了一段时间,而且我曾经考虑过类似的解决方案,所以我的问题没有得到真正的回答.我更新了要求1.) – 希望 – 更清楚地反映我想要的.如果没有这个,我可能会尝试将我当前的代码改进一个更稳定的版本,并将其放在github上.

编辑2(赏金结束):

尽管我对解决方案并不完全满意,但是boost :: irange结合boost :: transform作为ectamur建议最接近于做我想要的,所以我会给他的赏金.

解决方法

Boost.Range方法解决这个问题是使用transform iterator适配器:
auto rng = boost::irange(1,10)
    | boost::adaptors::transformed([](int i) { return i * i; });
std::vector<int> v{rng.begin(),rng.end()};

请注意,如何将转换的问题与输入范围的start / stop / step(可选)参数分开.

猜你在找的C&C++相关文章