C++ 中带有 lambda 的简单自定义迭代器

2024-05-26

假设我有一个容器,其中包含int,一个作用于包含以下内容的容器的函数Point,并且我有一个函数可以给出一些int给我相应的Point它代表(想象一下我已经在一些大的场景中索引了场景中的所有点std::vector<Point>)。如何创建一个简单(且高效)的包装器来使用我的第一个容器而不复制其内容?

我想要输入的代码是这样的:

template<typename InputIterator>
double compute_area(InputIterator first, InputIterator beyond) {
    // Do stuff
}

template<typename InputIterator, typename OutputIterator>
void convex_hull(InputIterator first, InputIterator beyond, OutputIterator result) {
    // Do stuff
}

struct Scene {
    std::vector<Point> vertices;

    foo(const std::vector<int> &polygon) {
        // Create a simple wraper with limited amount of mumbo-jumbo
        auto functor = [](int i) -> Point& { return vertices[polygon[i]]; });
        MagicIterator polyBegin(0, functor);
        MagicIterator polyEnd(polygon.size(), functor);
        // NOTE: I want them to act as random access iterator

        // And then use it directly
        double a = compute_area(polyBegin, polyEnd);

        // Bonus: create custom inserter similar to std::back_inserter
        std::vector<int> result;
        convex_hull(polyBegin, polyEnd, MagicInserter(result));
    }
};

所以,正如你所看到的,我正在寻找一些通用的东西。我也考虑过使用 lambda,但我对如何继续保持简单和用户友好感到有点困惑。


我建议Boost 的变换迭代器 http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/transform_iterator.html。这是一个用法示例:

#include <boost/iterator/transform_iterator.hpp>
#include <vector>
#include <cassert>
#include <functional>

struct Point { int x, y; };

template<typename It>
void compute(It begin, It end)
{
    while (begin != end) {
        begin->x = 42;
        begin->y = 42;
        ++begin;
    }
}

int main()
{
    std::vector<Point> vertices(5);
    std::vector<int> polygon { 2, 3, 4 };

    std::function<Point&(int)> functor = [&](int i) -> Point& { return vertices[i]; };

    auto polyBegin = boost::make_transform_iterator(polygon.begin(), functor);
    auto polyEnd = boost::make_transform_iterator(polygon.end(), functor);

    compute(polyBegin, polyEnd);
    assert(vertices[2].y == 42);
}

我不太明白有关定制的部分back_inserter。如果类型存储在result向量与函子返回的内容相同,标准库中的向量即可。否则你可以把它包裹起来transform_iterator, too.

请注意,函子存储在std::function。 Boost 依赖函子来拥有 typedefresult_type已定义,而 lambda 没有它。

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

C++ 中带有 lambda 的简单自定义迭代器 的相关文章

随机推荐

  • 带有非独特标签的熊猫

    我正在尝试对数据进行装箱并根据该装箱应用浮点值 我认为 pandas cut 是实现此目的的工具 但显然它需要每个 bin 标签都有唯一的值 values 0 6 0 5 0 5 0 6 0 8 0 9 bins 0 2 5 10 15 2
  • 有没有办法在 SQL Server CE 中一次搜索所有表的字段?

    我希望在 WebMatrix C net 环境 使用 SQL Server Compact 中能够有一种方法来搜索所有表和字段中的值 我有一堆 比如 100 个 表 通过 WebMatrix 连接 我正在尝试寻找一个包含我需要的一些信息的表
  • C# 如何 P/调用 NtRaiseHardError

    以下 C 代码会导致蓝屏 include stdafx h include
  • 查看 Linux 上的多核或多 CPU 利用率

    我有一个在 Linux 上运行的程序 我需要确定它如何利用所有 CPU 内核 有没有什么程序可以查看这些信息 跑过 top 命令并按下 1 查看各个核心
  • 在 C# 中异步发送电子邮件?

    我正在开发一个应用程序 用户在窗口中的某个按钮上单击 按 Enter 键 该应用程序会执行一些检查并确定是否发送几封电子邮件 然后显示另一个带有消息的窗口 我的问题是 发送 2 封电子邮件会明显减慢进程 并且在发送过程中的一些 8 秒内 第
  • 如何在 Three.js 中进入全屏?

    我已经尝试了数十种不同的方法几个小时 但没有一个有效 如下所示 document body addEventListener keydown function THREEx FullScreen request false 如何让Three
  • 如何使用 Apache POI XSSF 创建从右到左对齐的工作表

    我正在尝试使用 Apache POI 在 Excel 文件中创建一个工作表 由于它是 Excel 2007 我正在使用 XSSF 并且我正在寻找一种使工作表从右到左对齐的方法 HSSF中有一个方法org apache poi hssf us
  • 在 Matlab/Java 中将手部运动建模为 3D 曲线

    我只需要一些关于我遇到的问题 在哪里查看等的指导 我在我的一个项目中使用了运动跟踪手套 它返回每个手指和手掌的 X Y 和 Z 值 我想做的是首先根据这些坐标创建每个手指运动的表示 然后将它们每个附加到手掌的运动 以获得手的表示 一旦我完成
  • org.osgi.framework.BundleException:找不到包:org.eclipse.equinox.console

    命令 eclipse SDK 4 2RC3 win32 x86 64 001 eclipse plugins gt java jar org eclipse osgi 3 8 0 v20120529 1548 jar console 异常
  • Jquery - 仅发送表单中的一些值

    使用 checkTL 函数 我需要将输入值发送到服务器 例如 仅将输入值发送到类为 sideon 的 div 中 因此 在示例中 我需要 服务器端 仅获取 inputside0 和 inputside3 的值 这怎么可能 干杯 使用 AJA
  • 如何为自定义手势识别器实现velocityInView:?

    我正在实施一个自定义UIGestureRecognizer子类 我想实施velocityInView 同样的方式UIPanGestureRecognizer已经做到了 但我不确定如何去做 如何计算以点 秒为单位的速度 Firstly 如果您
  • iPhone存储然后从Documents文件夹中读取文件

    这一定很容易 但我想将一个文件放在 文档 文件夹中 该文件在启动时读入 我有关于如何阅读的代码 并已确认其在正确的目录中查找 但是 当我保存在 xcode 中的 Resources 文件夹中时 我的文件 RootList txt 存储在 R
  • Objective-C 中可以创建私有财产吗?

    Objective C 中可以创建私有财产吗 我确实知道一种私有财产功能可以通过另一种方式实现 但我对特定问题感兴趣 谢谢 是的 可以 但是代码看起来有点奇怪 如果你打电话它只会给你一些警告 你必须自己检查警告 在您的实现文件 m 中 in
  • JFileChooser 上的系统外观布局,但具有 Nimbus 外观主题

    JFileChooser 上的窗口外观和感觉布局比其他类似 nimbus 的外观和感觉要好得多 所以我正在寻找一种方法来拥有系统外观和感觉的布局 但在顶部有 nimbus 或其他主题 这可能吗 如果可以的话怎么办呢 这是可能的 虽然我不知道
  • 我可以将 Braintree.js 与 .NET Web 应用程序一起使用吗?

    我这几天一直在研究 Braintree Payments 我喜欢它的架构 概念等 在浏览完文档和 NET 演练后 我注意到 NET 的所有示例都在 MVC3 中 我正在尝试使用常规 Web 表单将 Braintree 集成到我当前的 NET
  • 仅当单击复选框时才更改 ListViewItem 的选中状态

    默认情况下 双击 ListViewItem 会切换其选中状态 我只想通过单击项目的复选框或在突出显示项目时按空格键来更改选中状态 这容易做到吗 该解决方案涉及 3 个事件和 1 个 bool 类型的状态变量 private bool inh
  • 在Python中,如果我返回“with”块内,文件仍然会关闭吗?

    考虑以下 with open path mode as f return line for line in f if condition 文件是否会正确关闭 或者是否使用return以某种方式绕过上下文管理器 https docs pyth
  • 转换不同世纪的日期

    我有暂存表 其中包含格式为 mm dd yy 的字符串形式的日期 我有 Oracle 11g 程序在加载到主表之前将字符串转换为日期格式 我在用着to date 03 20 34 mm dd rr 转换为日期格式 输出错误为 03 20 2
  • 如何从 .Net 打印对话框中删除打印机?

    我正在开发一个 Winforms 应用程序 它允许用户打印一些不同的 Reporting Services 报告 不幸的是 如果用户尝试使用 Adob e PDF 打印机打印为 PDF 则会崩溃 我们无法解决此问题 因此作为解决方案 我们希
  • C++ 中带有 lambda 的简单自定义迭代器

    假设我有一个容器 其中包含int 一个作用于包含以下内容的容器的函数Point 并且我有一个函数可以给出一些int给我相应的Point它代表 想象一下我已经在一些大的场景中索引了场景中的所有点std vector