使用迭代器将数组划分为大小不等的部分

2024-03-27

我有一个数组,需要将其分为 3 元素子数组。我想用迭代器来做到这一点,但最终我迭代到了数组的末尾并出现段错误即使我没有取消引用迭代器。给定:auto foo = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };我正在做:

auto bar = cbegin(foo);

for (auto it = next(bar, 3); it < foo.end(); bar = it, it = next(bar, 3)) {
    for_each(bar, it, [](const auto& i) { cout << i << endl; });
}

for_each(bar, cend(foo), [](const auto& i) { cout << i << endl; });

Now I can通过定义一个来解决这个问题finish迭代器:

auto bar = cbegin(foo);
auto finish = next(cend(foo), -(size(foo) % 3));

for (auto it = next(bar, 3); it != finish; bar = it, it = next(bar, 3)) {
    for_each(bar, it, [](const auto& i) { cout << i << endl; });
}

for_each(bar, finish, [](const auto& i) { cout << i << endl; });
for_each(finish, cend(foo), [](const auto& i) { cout << i << endl; });

但这似乎没有必要我不取消引用迭代器。为什么我不能做第一个版本?


您看到的段错误来自next http://en.cppreference.com/w/cpp/iterator/next检查范围是调试实现中的一个断言,用于检查未定义的行为。迭代器和指针的行为未定义为超出其分配的范围,并且“最后一个”元素:迭代器是否超过了“最后一次”迭代器的未定义行为? https://stackoverflow.com/q/37209725/2642059

这意味着增加超过“最后一个”元素是未定义的行为独立于迭代器的后续使用。为了定义行为,你must使用像整数模算法或类似的解决方案,但你必须改变auto it = next(bar, 3)至少基于子数组大小的可用性进行条件化的东西,例如:auto it = size(foo) <= 3 ? finish : next(bar, 3).

在可用的情况下,这里的最佳解决方案将导致最少的冗余迭代,即以整数形式跟踪容器中剩余的大小,当它超出范围和“超过末尾”时,不会出现未定义的行为。这可以通过以下方式完成:

auto bar = cbegin(foo);

for (auto i = size(foo); i > STEP; i -= STEP) {
    for(auto j = 0; j < STEP; ++j, ++bar) cout << *bar << '\t';
    cout << endl;
}

for(auto i = 0; j < STEP; ++j, ++bar) cout << *bar << '\t';
cout << endl;

编辑:我之前建议使用没有调试条件的指针,这是未定义的行为。

问题是next http://en.cppreference.com/w/cpp/iterator/next正在为您检查范围。例如,我们一直在分配的内存之外使用指针nullptr and end, 就这样it这是。如果你在这里只使用 C 风格的指针算术,那就没问题了:

auto bar = cbegin(foo);

for (auto it = bar + 3; it < cend(foo); bar = it, it = bar + 3) {
    for_each(bar, it, [](const auto& i) { cout << i << endl; });
}

for_each(bar, cend(foo), [](const auto& i) { cout << '\t' << i << endl; });

Live Example http://ideone.com/zSSKnj

或者,如果您在发布配置中运行,则应删除范围检查,以便您将能够使用代码的第一个版本。

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

使用迭代器将数组划分为大小不等的部分 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 如何在 SQL 中查找去年的同一个工作日?

    通常在销售报告等中 您需要将这一天与去年的同一天进行比较 但基于相同的 工作日 而不是 每月的某一天 例如 今天是 2013 年 6 月 20 日 星期四 我希望看到今天的销售额与去年同一个星期四的销售额 2012 年 6 月 21 日 而
  • 如何抑制由我​​无法更改的代码显示的对话框?

    我有一个来自第 3 方的 Inproc COM 服务器 我调用的函数之一如果捕获特定类型的错误 将显示错误消息对话框 问题是我正在尝试批量处理数据 而我正在使用的数据源导致错误对话框频繁弹出 如果它产生 1000 个对话框 这不会成为问题
  • javascript 内联有什么好的理由吗

    我一直在建立一个网站 在某个阶段 我注意到 IE 显示有点损坏 Chrome 几乎除了 body 标签 空 之外什么都没有渲染 而 FF 看起来都不错 在把键盘扔到房间里并用头撞鼠标后 我发现了问题 我在内联脚本块中留下了未关闭的 HTML
  • 运行 kubectl exec 时禁用 Kubernetes 上的网络日志

    跑步kubectl exec it
  • Oracle - 返回新插入的键值

    我们有一个带有主键的表 该表在插入时由表上的触发器填充 触发器从我们为表创建的序列中获取下一个序列号 并将其用作插入时键的值 现在我们希望能够在插入过程 PL SQL 中返回该值 类似于 SQL Server 中的 select scope
  • 为什么 .gitconfig [includeIf] 不起作用?

    系统设置 MacOS Catalina 10 15 6 gt git version git version 2 24 3 Apple Git 128 file gitconfig user name nickname email emai
  • 如何将大型对象/数组序列化为 JSON

    我的应用程序需要生成一个具有大对象的 jsondata数组类型的属性 数组在收集数据库输出时需要保留在内存中 并且某些属性只有在数组完成后才能确定 复杂性 数组是基于数字的 并且必须在 json 输出中出现 因此直接json encode
  • 使用内联“宽度”时省略像素

    这是一个有点愚蠢的问题 但对我来说理解很重要 据我所知 在 HTML 中使用内联 width 属性时 允许省略 px 除非使用百分比 20 否则将自动被理解为 20px 我的问题是 即使不需要 px 使用它是否错误 这段代码对我来说看起来非
  • 如何更改/usr/bin/env?

    我有使用的脚本 usr bin env ruby但我已经改用 Ruby Enterprise Edition 而不是 Ubuntu 服务器附带的默认 ruby 因此 当我尝试运行脚本时 它们会崩溃 如何添加 Ruby EE 路径 usr b
  • 如何使用 Apache POI 对 Excel 工作表中的行应用背景颜色?

    我正在使用 Apache POI 将数据导出到 Excel 工作表中 效果很好 问题是我需要在生成 Excel 工作表时为 Excel 工作表中的几行应用黄色背景颜色 请告诉我如何在生成时为 Excel 工作表的行应用背景颜色 谢谢 雷迪
  • 单父实体的核心数据性能

    我正在创建一个与核心数据一起使用的框架 在核心数据类上使用我的框架的要求之一是 您想要拥有框架功能的任何实体都需要是我提供给您的实体的子实体和子类 为此 我将该对象称为 Foo 今天我意识到 Core Data 将作为 Foo 子实体的所有
  • 在 Studio 中将大写字母转换为驼峰字母的简单方法?

    我有一堆 C 定义需要移植到 C C 定义是带下划线的大写字母 Net 枚举应该是驼峰式 有什么办法可以自动转换它们吗 一些我不知道的工具 或者也许是一个神奇的正则表达式 eg BOOTSTRAP NOT SUPPORTED gt Boot
  • 如何在进程的内存中搜索特定字符串?

    我对基础知识感兴趣 我不知道从哪里开始 我创建了这个测试程序 include
  • 如何在 LinqPad 中执行 ODATA 扩展

    我正在使用 LINQPad 连接到本地 CRM 组织上的 ODATA 服务 但我不知道如何使用 LINQPad 执行 联接 或遍历关系 这是我的网址 OrganizationData svc New locationSet select n
  • 如何在 Mac 上安装 NVM

    我尝试使用以下命令在 Mac 上安装 NVM curl o https raw githubusercontent com nvm sh nvm v0 39 1 install sh bash 但是 我收到一条错误消息 语法错误接近意外的
  • MPI+p 线程。程序卡在 MPI_Ssend 和 MPI_Recv 上

    我已经调试了这个程序2周了 它只有 93 行 但我仍然找不到错误 请帮我 这个程序在我的笔记本电脑上运行正常 但是当我在我的实验室 上海超算中心和济南超算中心的集群上运行时 就卡住了 这个程序的逻辑非常简单 有 2 个 MPI 进程 一个是
  • php.ini:哪一个?

    我从旧的 apache 迁移到 nginx 和 php 5 3 10 当我尝试修改 php ini 以满足我的需要时 我发现有 3 个 locate php ini etc php5 cgi php ini etc php5 cli php
  • 如何让 EF 将空字符串保留为 NULL?

    在我的域中 NULL 和空字符串之间没有重要区别 如何让 EF 忽略两者之间的差异并始终将空字符串保留为 NULL 空字符串不是字符串属性的默认值 因此这意味着您的代码正在某处设置空字符串 在这种情况下 您有责任处理 如果您在 POCO 中
  • Windows 安装程序中的主要与次要升级

    是否有任何理由不设置安装 以便始终完成主要升级并更改产品代码 我发现支持不同类型的安装需要更多代码 并且 修复 安装似乎通过重大升级更容易工作 而且需要安装的应用程序不是很大 因此不需要 服务包 或补丁安装程序 不会 如果您的应用程序很小并
  • 使用迭代器将数组划分为大小不等的部分

    我有一个数组 需要将其分为 3 元素子数组 我想用迭代器来做到这一点 但最终我迭代到了数组的末尾并出现段错误即使我没有取消引用迭代器 给定 auto foo 1 2 3 4 5 6 7 8 9 10 我正在做 auto bar cbegin