向量集合上的 C++ iterator_adapter [重复]

2024-04-16

可能的重复:
展平迭代器 https://stackoverflow.com/questions/3623082/flattening-iterator

我有一个某种类型的向量(比如 int)。我想迭代一下 在向量中的元素集合上,非常类似于迭代 在整数向量上。

我可以实现一些可以做到这一点的东西,但想知道如何使用 boost 迭代器适配器来执行此操作。


这是我破解的东西。它可以工作并输出正确的结果,但还有很多工作要做。

#include <boost/iterator/iterator_adaptor.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>

template <typename Iter>
class flattening_iterator :
    public boost::iterator_adaptor<
                flattening_iterator<Iter>,
                Iter,
                typename Iter::value_type::iterator::value_type,
                boost::forward_traversal_tag,
                typename Iter::value_type::iterator::value_type
    >
{
private:
        using super_t = boost::iterator_adaptor<
                                flattening_iterator<Iter>,
                                Iter,
                                typename Iter::value_type::iterator::value_type,
                                boost::forward_traversal_tag,
                                typename Iter::value_type::iterator::value_type
                        >;
        using inner_iterator = typename Iter::value_type::iterator;
public:
        flattening_iterator(Iter it)
                : super_t(it),
                  inner_begin(),
                  inner_end(),
                  outer_end(it)
        {}
        flattening_iterator(Iter begin, Iter end)
                : super_t(begin),
                  inner_begin((*begin).begin()),
                  inner_end((*begin).end()),
                  outer_end(end)
        {}
    using value_type = typename Iter::value_type::iterator::value_type;
private:
    friend class boost::iterator_core_access;
    inner_iterator inner_begin;
    inner_iterator inner_end;
    Iter outer_end;

    void increment()
    {
        if (this->base_reference() == outer_end)
            return; // At the end

        ++inner_begin;
        if (inner_begin == inner_end)
        {
            ++this->base_reference();
            inner_begin = (*this->base_reference()).begin();
            inner_end = (*this->base_reference()).end();
        }
    }

    value_type dereference() const
    {
        return *inner_begin;
    }
};

template <typename Iter>
auto flatten(Iter it) -> flattening_iterator<Iter>
{
    return flattening_iterator<Iter>(it);
}

template <typename Iter>
auto flatten(Iter begin, Iter end) -> flattening_iterator<Iter>
{
    return flattening_iterator<Iter>(begin, end);
}

int main()
{
    std::vector<std::vector<int>> v1{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    for (auto i = flatten(v1.begin(), v1.end()); i != flatten(v1.end()); ++i)
    {
        std::cout << *i << ' ';
    }
    std::cout << std::endl;
    std::vector<std::vector<std::string>> v2{{"Hello", "Print"}, {"Me", "Here"}};
    std::copy(flatten(v2.begin(), v2.end()), flatten(v2.end()),
                  std::ostream_iterator<std::string>(std::cout, " "));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向量集合上的 C++ iterator_adapter [重复] 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • 获取 std::variant 当前持有的 typeid(如 boost::variant type())

    我已经从 boost variant 迁移到 std variant 但遇到了障碍 我在 boost type 中使用了一个很好的函数 它可以让你获取当前持有的 typeid 看https www boost org doc libs 1
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取

随机推荐

  • 使用 Hive 自定义输入格式

    Update 好吧 事实证明以下不起作用的原因是因为我使用的是较新版本的InputFormat API import org apache hadoop mapred这是旧的与import org apache hadoop mapredu
  • 跳出选择循环?

    我正在尝试使用select在循环中接收消息或超时信号 如果收到超时信号 则循环应中止 package main import fmt time func main done time After 1 time Millisecond num
  • Android 使用前置摄像头拍照

    这是我第一次使用相机 我已经阅读了很多示例和文档 所以我尝试创建自己的类来使用前置摄像头拍照 这就是我想出的 public class CameraController private Context context private boo
  • 如何使用 Active Support 核心扩展

    我安装了 Active Support 3 0 3 和 Rails 3 0 3 with Ruby 1 8 7 当我尝试使用时1 week ago I get NoMethodError undefined method week for
  • 是否可以针对 noSQL DB 构建复杂的查询

    我一直在研究 noSQL DB 但未能为自己满意地回答这个问题 是否可以针对 noSQL DB 构建复杂的查询 我想知道的查询类型是这样的 select from DB where vara gt x AND varb 2 AND varc
  • 无法添加日期选择器选项?

    我有一个表单 它动态创建一个带有几个表单输入的新行 其中一个输入附有一个日期选择器 我刚刚在这里的帮助下成功完成了这项工作 除了还剩下一个问题 当我想向日期选择器添加选项时 它就会停止工作 工作小提琴 http jsfiddle net H
  • 无法使字段“属性”可访问;更改其可见性或为其声明类型 gSON fromJson 编写自定义 TypeAdapter

    我有一个名为游戏的课程 public class Game private String name private int id private GameFields gameFields Expose deserialize false
  • Clang 标志的完整列表

    在哪里可以找到 Clang 标志的完整列表 有一些 比如 include pch 这似乎没有在手册页中列出 我知道 GCC 使用一些相同的标志 但它不包括类似的文档 Os我相信这仅在 Clang 中可用 是否有地方可以找到所有 Clang
  • 使用 R 中的 drc 包回归​​多个剂量反应曲线

    我试图通过我的实验数据拟合回归 4 或 5 PL 我有几种化合物可以抑制我感兴趣的酶 每个都有其自己的 0 100 酶活性范围 所有数据都在一个数据框中 并通过指定我的化合物 毒素 的一列进行区分 因此 我想对每种毒素 化合物分别进行回归
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • SwiftUI View 协议中的EnvironmentObject

    我想制定这样的协议 protocol SubscriptionManagerView View var subscriptionManager EnvironmentObject
  • python装饰器,嵌套函数[重复]

    这个问题在这里已经有答案了 我试图弄清楚为什么在使用装饰器时我需要一个嵌套函数 这是一个例子 def func f def deco args kwargs return f args kwargs return deco func def
  • Numpy/ Pandas/ Matplotlib 安装时间太长

    我已经决定安装 MacOs Big Sur 现在我必须再次重新安装所有软件包 但我遇到了一些问题 我没有太多使用终端的经验 但安装一些数据科学库需要很长时间 例如 安装 numpy 花了几分钟 而现在 自从我开始尝试安装 pandas li
  • 在 Jade 中使用 HTML 被认为是不好的做法吗?

    Jade 看起来像一个很酷的模板引擎 我想我将在下一个项目中使用它 然而 有些语法对我来说没有意义 这样做你会得到什么 ul li a href book a Book A 代替 ul li a href book a Book A a l
  • 为什么使用互斥量而不是布尔变量进行线程同步?

    我正在尝试了解 C 中的多线程编程 我有疑问 既然我们使用MUTEXES来进行线程同步 为什么我们不能使用布尔变量来阻塞要执行的代码的关键区域 与布尔变量相比 静音变量有何特点 PS 其实这个问题是在采访中问到的 因此 请分享您对此的了解
  • 可用 Wifi 设备列表

    我想显示可用 Wifi 设备的列表 这是我的代码 我不明白这里有什么错误 wifi WifiManager getSystemService Context WIFI SERVICE if wifi isWifiEnabled false
  • 如何向 AWS 根账户 MFA 添加更多设备

    我的 iPhone 中已经安装了 Google 身份验证器 并且正在使用它登录我的 AWS 根账户 我想添加使用我的 Android 手机通过 MFA 登录的功能 并使用相应的令牌生成器 Android 应用程序 是否可以添加第二个设备以及
  • 具有多个参数的 Laravel FindOrNew

    我使用 laravel FindOrNew 来获取具有两个参数的条目 或创建一个新参数 option App Option findOrNew user id gt this gt id option name gt optionName
  • 如何为一般 authError 消息定义 FlashHelper/Component 元素

    将 CakePHP 从 2 6 2 更新到 2 7 2 后 在创建 auth flash 消息时出现丢失密钥错误 如何定义默认的元素模板authError Since SessionComponent setFlash 已经已弃用 http
  • 向量集合上的 C++ iterator_adapter [重复]

    这个问题在这里已经有答案了 可能的重复 展平迭代器 https stackoverflow com questions 3623082 flattening iterator 我有一个某种类型的向量 比如 int 我想迭代一下 在向量中的元