首页 > 其他分享 >03 | 写一个能产生斐波那契数列的range——惰性求值

03 | 写一个能产生斐波那契数列的range——惰性求值

时间:2023-04-23 11:47:23浏览次数:46  
标签:03 const iterator operator 斐波 sentinel fibonacci 求值 return

1.首先为了满足 range 概念的要求我们需要提供 begin() 和 end()
2.begin() 和 end() 返回的应该是迭代器,注意这个地方两种可以返回两种不同类型(c++17后即可)
3.为了满足迭代器 概念的要求我们提供5个 typedef,并根据 std::input_iterator_tag 类型决定我们要实现的“解引用函数”,“前后置++”,“比较函数”等。

#include <stddef.h>
#include <iostream>
#include <ranges>
#include <stdint.h>
#include <concepts>

class fibonacci {
public:
    class sentinel;
    class iterator;
    iterator begin() noexcept;
    sentinel end() noexcept;
};

class fibonacci::sentinel {};

class fibonacci::iterator {
public:
    // Required to satisfy iterator
    // concept
    typedef ptrdiff_t               difference_type;
    typedef uint64_t                value_type;
    typedef const uint64_t*         pointer;
    typedef const uint64_t&         reference;
    typedef std::input_iterator_tag iterator_category;
    value_type operator*() const
    {
        return b_;
    }
    pointer operator->() const
    {
        return &b_;
    }
    iterator& operator++()
    {
        auto tmp = a_;
        a_ = b_;
        b_ += tmp;
        return *this;
    }
    iterator operator++(int)
    {
        auto tmp = *this;
        ++*this;
        return tmp;
    }
    bool operator==(const sentinel&) const
    {
        return false;
    }
    bool operator!=(const sentinel&) const
    {
        return true;
    }

private:
    uint64_t a_{0};
    uint64_t b_{1};
};

// sentinel needs to be
// equality_comparable_with iterator

bool operator==(const fibonacci::sentinel& lhs,
                const fibonacci::iterator& rhs)
{
    return rhs == lhs;
}

bool operator!=(const fibonacci::sentinel& lhs,
                const fibonacci::iterator& rhs)
{
    return rhs != lhs;
}

inline fibonacci::iterator fibonacci::begin() noexcept
{
    return iterator();
}

inline fibonacci::sentinel fibonacci::end() noexcept
{
    return sentinel();
}


int main(){
    // 打印头20项
    for(auto i:fibonacci()|std::ranges::views::take(20)){
        std::cout<<i<<std::endl;
    }
    // 打印小于 10000 的数列项
    for(auto i:fibonacci()|
        std::ranges::views::take_while([](uint64_t x){
            return x<1000;
        })){
            std::cout<<i<<std::endl;
    }
}

标签:03,const,iterator,operator,斐波,sentinel,fibonacci,求值,return
From: https://www.cnblogs.com/mmxingye/p/17345964.html

相关文章

  • 运维 —— IMP-00030: failed to create file import_sys for write
    IMP-00030:failedtocreatefileimport_sysforwriteIMP-00000:Importterminatedunsuccessfully原因:操作系统用户oracle对dmp文件没有权限drwxr-xr-x 2root  root       42Feb 316:57dmp_dir解决办法:登录root用户,对用户oracle赋予dmp文件一些权限在root......
  • 【WPF学习】03 控件模板
    查看控件样式具体属性在VirtualStudio中,我们可以通过文档大纲找到具体元素控件,右键选择“编辑模板--编辑副本”可以查看该控件当前的样式具体属性设置,再未对控件自定义样式的时候通过这种方法查看到的即为系统为该控件预设的样式属性由此再注释几个属性:ContentPresenter定......
  • ICS TRIPLEX 工业模块 T8403
    W;1 ⑧ 0 ③0① ⑦ 7 7⑤9ICSTRIPLEX工业模块T8403 TC-505-02-4M5 发电系统的发电机组控制伍德沃德为发电机组市场提供范围广泛的控制器。我们努力降低总安装/运营成本和调试时间,同时提高可用性、效率、可靠性和寿命。T8403 T8403 T8461 T8461C T8403 ......
  • 斐波拉契数列
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 先写出来前几个月的兔子数,分别是1、1、2、3、5、8、13、21、34......就是这样一组数列,第三个数是前两个数的和,也就是n=(n-1)+(n-2) ......
  • 解决vue2.0路由 TypeError: Cannot read property 'matched' of undefined 的错误问题
      找了很久这个问题 解决vue2.0路由TypeError:Cannotreadproperty'matched'ofundefined的错误问题-北桥苏-博客园(cnblogs.com)  解决办法改为   问题解决  没有找到为什么 好像高版本的router没有这个问题 我因为需要降级到了3.1.3 ......
  • 算法学习day03链表part01-203、707、206--待办
    //这块需求重新进行学习packageLeetCode.linkedlistpart01;publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicLis......
  • Loading class `com.mysql.jdbc.Driver'. 问题
     解决Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.警告问题错误提示:Loadi......
  • sql语法错误[1093] You can't specify target table 'score' for update in FROM clau
    不能在同一张表中将查询非结果集作为更新条件执行将需要的结果集外层套一层自查询如updateaseta.num=a.num+1wherea.namein(selecta.agefromawherexx=xxx);报错[1093]Youcan'tspecifytargettable'score'forupdateinFROMclauseupdateaseta......
  • 03:基础入门-搭建安全拓展
    1、涉及的知识点常见的问题#ASP,PHP,ASPx,JSP,PY,JAVAWEB等环境#WEB源码中敏感文件后台路径,数据库配置文件,备份文件等#ip或域名解析wEB源码目录对应下的存在的安全问题域名访问,IP访问(结合类似备份文件目录)#脚本后缀对应解析(其他格式可相同-上传安全)#存在下载或为解......
  • 装了.Net 7.0后,工程框架用 net6 的 dotnet watch 出错临时解决方案 Could not load fi
    升级vs或者装了.Net7.0后,工程框架用net6的dotnetwatch出错‘Unhandledexception.System.IO.FileNotFoundException:Couldnotloadfileorassembly‘System.Runtime,Version=7.0.0.0’   临时解决方案:工程目录下建立global.json文件指定编译框架{"......