c – 使用迭代器行为生成函子
我有一个问题,这可能是以前被问过的,因为我想我想要的是相当多的人想要的东西.然而,我无法想出任何表达方式,将返回我想要的搜索(不是谷歌,而不是在这里).所以也许这里的答案只是用来描述我的意思的单一术语.
我想要实现的是大致如下: >它可以使用functor struct / class并生成一个值序列 我认为这个名字应该是生成器或生成迭代器,因为这是它的作用,但是我一直非常失败地找到与该术语有关的东西.我写了我自己的实现,但它有它的问题,我想问,如果有这样的事情,然后再付出更多的努力. 为了保存你粘贴所有后续代码的工作,如果你想尝试这个,我把它放在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,因为根据我的研究,所有其他迭代器都必须返回一个引用 状况:答案到目前为止都是好的,但是在提出之前我已经有了一些思考了一段时间,而且我曾经考虑过类似的解决方案,所以我的问题没有得到真正的回答.我更新了要求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(可选)参数分开. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |