在 C++ 中将惰性生成器实现为forward_iterator

2024-05-01

MyGenerator 表示(可能)有限的整数序列,计算成本很高。所以我不想预先生成它们并将它们放入容器中。

struct MyGenerator{
  bool HasNext();
  int Next();
}

要打印全部:

MyGenerator generator;
while (generator.HasNext()) {
  std::cout << generator.Next() << std::endl;
}

如何实现一个遵循forward_iterator协议的类似生成器?

boost::function_input_iterator http://www.boost.org/doc/libs/1_50_0/libs/iterator/doc/function_input_iterator.html很接近,但我不知道前面的元素数量。


首先,看一下实现boost::function_input_iterator,因为您想要的是相同的,只是必须修改迭代器的相等性测试,以应对您不知道它是否是无限的以及如果不是的话有多少项的事实。一旦您习惯了这种风格,Boost 的作者将通过他们的代码为您提供比我更好的建议:-)

也就是说,沿着这些思路(未经测试):

template <typename Generator>
struct generator_iterator : iterator<forward_iterator_tag, int> {
    generator_iterator(const Generator &gen, end = false) : count(0), gen(gen), last_val(0), is_end(end) {
        if (!end) advance();
    }
    void advance() {
        if (gen.HasNext()) {
            lastval = gen.Next();
        } else {
            is_end = True;
        }
        count += 1;
    }
    int operator *() {
        return lastval;
    }
    generator_iterator &operator++() {
        advance();
        return *this;
    }
    generator_iterator operator++(int) {
        generator_iterator result = *this;
        advance();
        return result;
    }
    bool operator==(const generator_iterator &rhs) {
        return (is_end && rhs.is_end) || (count == rhs.count);
    }
    bool operator!=(const generator_iterator &rhs) {
        return !(*this == rhs);
   }

    size_t count;
    Generator gen;
    int lastval;
    bool is_end; 
};
  • 原则上,计数可以换行,尽管您只需要在较小的实现上担心这一点size_t,因为 64 位在实践中永远不会换行。为了安全起见,您可以使用不同的类型来计数:uint64_t或者如果所有其他都属于用户定义的大整数类型。咨询std::iterator不过,文档,因为一旦你的迭代器运行时间超过size_t你想给它一个非默认值difference_type.
  • 方式Generator必须是可复制的(并且副本必须与原始版本具有相同的状态,并且此后两者必须独立前进),否则您没有机会实现forward_iterator除了存储发电机可能无限量的输出之外。如果您只需要一个input_iterator那么你可以参考Generator引用。
  • 如果您不需要包装以前的MyGenerator,而不是你只想知道如何编写一个可能无限的迭代器,那么你可以摆脱模板参数,在迭代器中存储你喜欢的任何状态,然后只需将代码放入以推进状态advance().
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中将惰性生成器实现为forward_iterator 的相关文章

  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • useReducer 未同步更新状态的问题

    根据React docs 当你有复杂的情况时 useReducer 通常比 useState 更好 涉及多个子值或下一个状态时的状态逻辑 取决于前一个 1 有人可以解释一下为什么吗useReducer不是同步更新状态吗 const redu
  • 显示“另存为”对话框并将文本区域内选定文本的内容保存到客户端 PC 上的文件中[重复]

    这个问题在这里已经有答案了 可能的重复 仅使用 Javascript 将文本区域内容下载为文件 无服务器端 https stackoverflow com questions 609530 download textarea content
  • 在 WKWebView 中加载 Microsoft Office 文档

    我已经使用 UIWebView 在我的应用程序中显示 Microsoft Office 文档 Word PowerPoint Excel 一段时间了 但 Apple 最近已弃用 UIWebView 类 我正在尝试切换到 WKWebView
  • 管道破裂错误

    我在 FTP 实现中的打开的数据套接字上使用 write 来发送文件 但写入一些数据后 它会挂起一段时间 之后它会返回 损坏的管道 错误 对此的任何帮助将不胜感激 我的进程从一个缓冲区读取数据包并写入套接字 我在增加带宽时注意到了这个问题
  • Safari 不设置 cookie,但 Chrome 和 Firefox 会设置

    我正在将请求从本地主机发送到第三方服务器以使用 REST API 获取数据 后端使用cookies JSESSIONID 来了解是否发送数据 在 Chrome 中一切正常 我可以在 Chrome 浏览器的 应用程序 选项卡中看到 Cooki
  • Bootstrap 与 Haml 和 Rails 一起崩溃

    我对 Rails 编程等很陌生 所以如果这是非常基本的 我很抱歉 我正在尝试让 twitter bootstrap crash js 在我的网络应用程序上工作 我试图遵循这里的结构http getbootstrap com javascri
  • 如何在 Tensorflow 中计算 R^2

    我正在尝试在 Tensorflow 中进行回归 我不确定我计算 R 2 是否正确 因为 Tensorflow 给出的答案与sklearn metrics r2 score有人可以看看我下面的代码 让我知道我是否正确地实现了图中的方程 谢谢
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 如何在编译时检查该类是否是抽象的?

    我所说的抽象类是指至少具有一个纯虚方法的类 如果检查显示该类是 我希望编译失败not抽象的 有可能吗 Use std is abstract http en cppreference com w cpp types is abstract
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发
  • 使用包名称获取所有活动

    我想通过使用 PackageInfo 将应用程序中存在的所有活动作为列表获取 请告诉我有什么办法可以做到这一点 提前致谢 我的问题得到的答复如下 public static ArrayList
  • 如何在类的 Dispose 方法中取消订阅匿名函数?

    我有一个 A 类 在它的构造函数中 我正在为 Object B 的 eventHandler 分配一个匿名函数 如何从 A 类的 Dispose 方法中删除 取消订阅 它 任何帮助 将不胜感激 谢谢 Public Class A publi
  • 检查 UIImage 是否有 alpha(透明)颜色时出现问题

    我正在检查图像是否有透明区域 alpha 受到打击 我必须改变颜色UIImage 我已经实现了以下方法来检查图像是否有alpha or not BOOL checkAlpha UIImage image for int x 0 x lt i
  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • 在 Checkbox.Checked 或 Unchecked 上执行命令

    我的窗口上有一个复选框控件 我想执行一个命令来调用关联视图模型中的方法 我还需要复选框的值 我似乎找不到将命令与复选框关联起来的方法 有人这样做过吗
  • 在鼻子测试中打印不同的长描述以及测试名称 python

    我正在使用命令 nosetests test py 运行时仅打印描述的第一行 我想要完整的描述以及测试名称 我怎么做 测试 py 文件 import unittests class TestClass unittest TestCase d
  • pdo如何检查它是否是从数据库检索的第一条记录?

    sql3 SELECT member FROM levels where upline AND level 1 q3 conn gt prepare sql3 q3 gt execute array level2downlines whil
  • 无法分配“导入类”,因为它是导入 - Javascript

    我一直在初始化一些常量类 export class A foo string b B export class B bar number 然后将它们导入另一个类并在另一个文件中初始化它们 但是 如果我想初始化 A 类时使用 B 类时遇到问题
  • 开发 Google Assistant 应用程序的成本?

    开发和 或发布 Google Assistant 应用程序涉及哪些成本 例如 您可以使用 DialogFlow 和后端 例如 Firebase 开发应用程序 而无需在学习时付费吗 首先 你不need使用 Dialogflow 或 Fireb
  • 在 C++ 中将惰性生成器实现为forward_iterator

    MyGenerator 表示 可能 有限的整数序列 计算成本很高 所以我不想预先生成它们并将它们放入容器中 struct MyGenerator bool HasNext int Next 要打印全部 MyGenerator generat