我想要实现的是大致如下:
>它可以使用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建议最接近于做我想要的,所以我会给他的赏金.