迭代 std::deque 时擦除元素时出现分段错误

2023-11-26

为什么下面的代码会崩溃?当我通过反向迭代器进行迭代时应该做什么。那么如何删除单个元素呢?

deque q;
q.push_back(4);
q.push_back(41);
q.push_back(14);

for (auto it = q.begin(); it != q.end();) {
    auto current = it;
    q.erase(current);
    it++; 
}

  1. 为什么下面的代码会崩溃?那么我该如何删除单个元素呢?

std::deque::erase使迭代器无效。

所有迭代器和引用都无效,除非被擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对被擦除元素的引用无效。

尾后迭代器也会失效,除非被擦除的元素位于容器的开头并且最后一个元素未被擦除。

在您的代码中,要删除的元素的迭代器(即it and current) 后将失效q.erase(current), then it++将通向UB。

您可以利用的返回值std::deque::erase

跟随最后删除的元素的迭代器。如果迭代器 pos 引用最后一个元素,则end()返回迭代器。

for (auto it = q.begin(); it!=q.end(); )
{
    it = q.erase(it);
}
  1. 如果我通过反向迭代器进行迭代,我该怎么办。

Because std::deque::erase不接受reverse_iterator作为参数,您需要使用base()将其转换为普通迭代器(注意位置转换)。例如

for (auto it = q.rbegin(); it!=q.rend(); )
{
    it = std::make_reverse_iterator(q.erase((++it).base()));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代 std::deque 时擦除元素时出现分段错误 的相关文章

随机推荐

  • 在 Delphi 2009 中我需要释放变体数组吗?

    如果我有一个只包含简单类型的变体数组 以及可能的简单类型的进一步变体数组 我是否需要执行任何显式操作来释放内存 或者这一切都为我处理好了 我一直以为没什么可做的 但我只是有一点疑问 变体是托管类型 它们由编译器的引用计数系统拥有 不需要手动
  • ios 延迟位置更新无法延迟

    我正在考虑对 iOS 活动跟踪器使用延迟位置更新 它允许在后台提供位置服务 我已经实现了建议的代码片段 见下文 在 Xcode 调试中 延迟位置会尝试启动几次 直到位置数据以大约每秒 1 次的速度传入 之后 它声称启动延迟成功 并且在指定时
  • .NET foreach 语句是否保证按照集合的构建顺序迭代集合?

    一位同事在他编写的一些 C 代码中使用了 for 循环来迭代 List 并留下了评论 没有使用 For Each 因为我不确定它是否按顺序迭代 谁知道 Microsoft 会做什么 例如 假设我们有一个像这样构建的列表 var someLi
  • 如何让Java注册一个带有空格的字符串输入?

    这是我的代码 public static void main String args Scanner in new Scanner System in String question question in next if question
  • 数据建模:逻辑建模练习

    在尝试学习数据存储艺术的过程中 我一直在尝试获取尽可能多的可靠信息 PerformanceDBA 在以下帖子中发布了一些非常有用的教程 示例 我的数据标准化了吗 and 关系表命名约定 我已经问过这个模型的一个子集问题here 因此 为了确
  • yocto:如何安装命令 locale 和 localedef?

    如何在 yocto 项目中为我的图像安装命令 locale 和 localedef 我已尝试以下操作 IMAGE INSTALL append glibc locale 但这不起作用 我该怎么做 locale位于一个名为glibc util
  • 了解 PKCE 与授权代码授予的优势

    我是 OAuth 世界的新手 我试图了解使用 PKCE 相对于传统授权代码授予的好处 我的许多假设可能是错误的 所以感谢您的指正 我是一名移动应用程序开发人员 根据 OAuth 文档 客户端机密不能在公共客户端的应用程序代码中进行硬编码 避
  • firebase云函数中的权限被拒绝

    在 firebase 云功能中 我在读取或写入实时数据库时在 admin firebase 上被拒绝访问 这https github com firebase firebase functions issues 16没有解决我的问题 App
  • DRF 中的动作装饰器不适用于 url_path

    我正在努力实现这样的终点 api messages
  • 为什么我不能使用urlencode编码json格式数据?

    我有一个关于 python 2 7 中的 urlencode 的问题 gt gt gt import urllib gt gt gt import json gt gt gt urllib urlencode json dumps titl
  • 实现 47 度 android-swipelistview 用于滑动 android ListViewItem

    实际上我的目标是在android中实现ListViewItem Swipe 我已经尝试过了 stackoverflow 有几个可以让你的 ListViewSwipe 的例子 例子 简单的滑动手势活动教程 从列表视图中滑动一项时在列表视图中显
  • 将程序加载到 RAM 并执行它们 NASM 16b

    我迫切需要解决这个问题 我正在尝试开发汇编代码 允许我加载和执行 通过用户的输入 2 个其他 Assembly EXE 程序 我有两个问题 我似乎无法将路径名分配给有效的寄存器 或者可能是错误的语法 我需要能够在第一个程序 可能是 开始执行
  • Python 对象删除自身

    为什么这不起作用 我正在尝试使类的实例删除自身 gt gt gt class A def kill self del self gt gt gt a A gt gt gt a kill gt gt gt a lt main A instan
  • SPA 中刷新令牌 Cookie 的 CSRF 保护

    我在 AngularJS SPA 中使用资源所有者密码凭据 OAuth 2 0 流程 有几篇文章 here here 以及答案这个问题这说明我们不应该将刷新令牌存储在 Web 客户端 LocalStorage 上 而是将它们加密存储在 Ht
  • 使用 android.telecom 和 InCallService 接听来电

    自 API 21 以来 Google 一直在添加功能android 电信总体而言 特别是通过实施更多成员电信经理并添加通话服务 最后一个应该允许非系统 第三方应用程序提供和替换系统呼叫应用程序通话中屏幕的功能 弹出并允许执行操作的窗口EXT
  • Asm代码解释

    以下 GCC 内联汇编取自 LuaJit 的 coco 库 有人可以逐行解释它的作用吗 static inline void coco switch coco ctx from coco ctx to asm volatile movl 1
  • tesseract 安装 mac 操作系统

    我正在尝试使用 homeBrew 在我的 mac 上安装 tesseract 当我尝试安装时 一切似乎都很好 但我收到以下错误 消息 Warning Could not link leptonica Unlinking Error The
  • shell脚本测试

    我正在尝试更新其他人编写的 bash 脚本 但遇到了一行我不确定的内容 谁能告诉我以下检查的作用 if RESULT 0 0 我假设它正在检查 RESULT 中的某些值 可能带有子字符串 任何帮助表示赞赏 命令 只是命令的别名test 右方
  • CORS 适用于对 API 的直接请求,但不适用于静态文件(如 css)

    我们正在开发一个由 Android 组成的项目Mobile App连同一个Web API Web API 是 Asp net MVC Core 我已经启用了CORS服务于我的Startup cs 因此移动应用程序 API 调用可以跨源访问
  • 迭代 std::deque 时擦除元素时出现分段错误

    为什么下面的代码会崩溃 当我通过反向迭代器进行迭代时应该做什么 那么如何删除单个元素呢 deque q q push back 4 q push back 41 q push back 14 for auto it q begin it q