制作循环迭代器(循环器)的最简单方法?

2024-01-08

我有一个物体想要在游戏中连续循环移动。我有一系列坐标std::vector我想用作航路点。

有什么办法可以制作一个std::vector<T>::iterator循环(也称为循环器)?

我能想到的最好的方法是拥有两个迭代器,然后每当第一个迭代器耗尽时,将第二个迭代器的值分配给它(它不会用于执行任何其他操作),但我什至不确定它是否会起作用 - 会赋值运算符会复制迭代器用于保存索引的任何内容,还是仅会引用它(因此在第二轮之后将毫无用处)?

我希望对象永远沿着路径点移动(除非它被破坏,但在该方法中不会发生这种情况),但迭代器只会为每个帧调用一次并且必须返回,以便我可以更新游戏中的其他对象。

该解决方案必须适用于 gcc 和 microsoft 编译器(如果无法用标准 C++ 编写)。


好的,现在你的问题更清楚了:-)

看一下 boost::iterator_facade 和 boost::iterator 适配器。他们实现了完整的迭代器接口和你的cycle_iterator仅用于实现一些方法,如increment()、decrement():

template<class IteratorBase>
class cycle_iterator 
     : public boost::iterator_adaptor< 
          cycle_iterator,     // the derived class overriding iterator behavior
          IteratorBase,       // the base class providing default behavior
          boost::use_default, // iterator value type, will be IteratorBase::value_type
          std::forward_iterator_tag, // iterator category
          boost::use_default  // iterator reference type
       > 
{
  private:
     IteratorBase m_itBegin;
     IteratorBase m_itEnd;

  public:
     cycle_iterator( IteratorBase itBegin, IteratorBase itEnd ) 
       : iterator_adaptor_(itBegin), m_itBegin(itBegin), m_itEnd(itEnd)
     {}

     void increment() {
        /* Increment the base reference pointer. */
        ++base_reference();

        /* Check if past-the-end element is reached and bring back the base reference to the beginning. */
        if(base_reference() == m_itEnd)
            base_reference() = m_itBegin;
     }

     // implement decrement() and advance() if necessary
  };

这可能无法编译,但应该可以帮助您入门。

Edit:

升压::迭代器适配器 http://www.boost.org/doc/libs/1_41_0/libs/iterator/doc/iterator_adaptor.html用几个函数实现了完整的迭代器接口。它提供了默认实现increment(), decrement(), advance(), distance_to(), equal_to() and dereference()使用传递给的基本迭代器iterator_adaptor基类。

如果您需要的只是一个前向迭代器,则只需increment()方法必须实现为在到达结束迭代器后回绕。如果您实现循环迭代器可以是双向的decrement()以类似的方式。如果IteratorBase本身是一个随机访问迭代器,循环迭代器也可以是随机访问和方法advance and distance_to必须使用模运算来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作循环迭代器(循环器)的最简单方法? 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • PDF:提取的图像被切片/平铺

    图像提取pdfimages and mupdf mutool到目前为止工作正常 使用 FreePDF 生成的 PDF 中的图像始终会被切片 因此一张图像会生成多个图像文件 有什么技巧可以避免这种情况吗 我如何使用结果pdfshow 有没有坐
  • Lucene 索引

    我想使用 Lucene 为现有数据库中的表建立索引 我一直在想这个过程是这样的 为表中的每一列创建一个 字段 存储所有字段 分析 除具有主键的字段之外的所有字段 将表中的每一行存储为 Lucene 文档 虽然此表中的大多数列都很小 但其中有
  • Windows 窗体内存泄漏

    我在 Windows 应用程序中发现轻微的内存泄漏 我在我的应用程序中使用 DevExpress XtraForm 我看到的是该表格的一个实例始终保存在内存中 如果您多次打开同一个表单 它仍然保留上次打开的表单的引用 前任 如果您在应用程序
  • 如何强制删除GitHub中的远程分支?

    我有 2 个远程分支 pending issues in project new issues in project 我尝试删除pending issues in project像这样 git push origin pending iss
  • 提取最新记录

    我有一个这样的表 SKU AVG COST DATE TIME AAA 1 50 20110301 110331 AAA 1 52 20110302 140005 AAA 1 54 20110303 150301 AAA 1 56 2011
  • Python:当“列表”指同一事物时为什么使用“列表[:]”?

    考虑列出一个清单 gt gt gt l 1 2 3 使用有什么好处 gt gt gt l when gt gt gt l打印和以前一样的东西吗 Thanks 它创建一个 浅 副本 gt gt gt l 1 2 3 gt gt gt m l
  • 如何从svn中删除“-”文件?

    我不小心在目录中创建了文件 只是减号 并提交了它 我必须删除它 因为它在其他机器上引起错误 svn 无法将字符串从 UTF 8 转换为本机编码 svn 226 128 147 我可以使用 rm i 或 python os remove xe
  • 是否可以在不使用 s3 的情况下在 sagemaker 中进行预测

    我有一个 pkl 我想将其投入生产 我想对我的 SQL 服务器进行日常查询并对大约 1000 行进行预测 这文档 https docs aws amazon com sagemaker latest dg how it works batc
  • 如何在非表单应用程序中生成击键

    所以我有一个巨大的程序 并决定我应该让其中一个方法在单独的线程中运行 所以我将该方法放在一个单独的类中 并在我的表单上激活它 它似乎按照我想要的方式工作 直到它到达给我这个错误的地方 SendKeys 无法在此应用程序内运行 因为该应用程序
  • reverse_lazy() 和 URL 加载?

    我试图理解 Django 概念 但我对 URLResolver 很挣扎reverse lazy 据我所知 我必须使用reverse lazy 当我想反转到尚未加载的 URL 时 所以当我创建 CBV 并声明success url I use
  • 如何减少 Visual C++ 项目(本机 C++)的编译时间和链接时间?

    如何减少 VC 项目 本机 C 的编译时间和链接时间 请指定每个建议是否适用于调试 发布或两者 这对您来说可能听起来很明显 但我们尝试尽可能多地使用前向声明 即使它需要写出类型所在的长命名空间名称 Forward declaration s
  • Excel 公式 -> 如何更改 SUMPRODUCT 公式以跳过空单元格

    上下文是我正在使用调整后的和积公式来计算加权平均值 问题是sumproduct 包含数组中的空单元格 gt 加权平均值计算不正确 问题是如何编辑 sumproduct 以排除数组中的空单元格 或者还有其他干净整洁的解决方案吗 在 sumpr
  • 设置EditText光标颜色

    我在平板电脑项目上使用 Android 的 Holo 主题时遇到了这个问题 但是 我在屏幕上有一个具有白色背景的片段 我正在添加一个EditText该片段上的组件 我尝试通过设置 Holo Light 主题资源的背景来覆盖主题 但是 我的文
  • 为什么要编译成中间代码?

    为什么Actionscript Java C 等要编译成中间代码 我知道使用中间代码的跨平台优势 问题是 与解释的脚本 JS Python PHP Perl 等 相比 编译为中间代码有什么好处 仅仅是为了代码混淆吗 或者是什么 此外 与编译
  • 为什么 event.currentTarget null 和 e.target 总是相同? [复制]

    这个问题在这里已经有答案了 我很好奇为什么当前目标输入 Event listener 中为 null 和e target总是第一个元素被点击 我试图通过单击然后在输入字段中插入数字来更改每条折线的 ID 但是如果我想在更改第一个元素后更改第
  • 如何从 Python 列表中删除某个元素的所有实例? [复制]

    这个问题在这里已经有答案了 假设我有一个清单a a 1 1 2 2 1 1 3 3 1 1 是否有一个函数可以删除所有实例 1 1 如果您想就地修改列表 a x for x in a if x 1 1
  • 我想计算开始时间 = 23:30 和结束时间 = 00:15 之间的时间差,时间差即将到来 -23.25

    我想计算时差 start time 23 30 Finish time 00 15 时间差是 23 15 而不是 45 分钟 my code DATEDIFF minute Start Time Finish Time 由于数据类型是Tim
  • Ruby on Rails 在页面上查看渲染数据库信息

    我正在开发一个项目 目前正在处理一个视图 该视图是不同类别的页面 一切都正确呈现 但它也将数据库信息放入页面中 这是我的观点的代码 div class categories div class container blurbs div cl
  • 根据时间限制Firestore中特定类型的用户阅读文档

    有没有办法使用 Firestore 规则根据时间限制用户阅读 例如 限制经过身份验证的匿名用户的恶意用户每毫秒读取文档多次 这可能会导致多次请求的定价上涨 无法使用安全规则来限制文档读取速率 如果您认为有人滥用您项目中的资源 联系 Fire
  • 制作循环迭代器(循环器)的最简单方法?

    我有一个物体想要在游戏中连续循环移动 我有一系列坐标std vector我想用作航路点 有什么办法可以制作一个std vector