为什么 std::list 上的 Push_back 会更改使用 rbegin 初始化的反向迭代器?

2024-04-24

根据我发现的一些 STL 文档,在 std::list 中插入或删除元素不会使迭代器失效。这意味着允许循环列表(从begin() to end()),然后使用push_front添加元素。

例如,在下面的代码中,我用元素 a、b 和 c 初始化一个列表,然后循环遍历它并执行元素的 push_front。结果应该是 cbaabc,这正是我得到的:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
   testList.push_front(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

当我使用反向迭代器时(从rbegin() to rend())并使用push_back,我期望类似的行为,即 abccba 的结果。但是,我得到了不同的结果:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
   testList.push_back(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

结果不是abccba, but abcccba。没错,又多了一个c。

看起来第一个push_back也改变了用rbegin()初始化的迭代器的值。在push_back之后,它不再指向列表中的第三个元素(以前是最后一个),而是指向第四个元素(现在是最后一个)。

我使用 Visual Studio 2010 和 GCC 对此进行了测试,两者都返回相同的结果。

这是一个错误吗?或者我不知道的反向迭代器的一些奇怪行为?


该标准规定迭代器和引用在插入期间保持有效。它没有提及任何有关反向迭代器的内容。 :-)

The reverse_iterator由返回rbegin()内部保存的值end()。之后push_back()这个值显然和以前不一样了。我认为标准并没有说明它应该是什么。明显的替代方案包括列表的前一个最后一个元素,或者如果它是固定值(如哨兵节点),则它保留在末尾。


技术细节:返回的值rend()不能指向之前begin(),因为这是无效的。所以决定rend()应包含的值begin()并将所有其他反向迭代器进一步移动一位。这operator*对此进行补偿并无论如何访问正确的元素。

24.5.1 反向迭代器的第一段说:

类模板reverse_iterator是一个迭代器适配器,从定义的序列末尾开始迭代 通过其底层迭代器到该序列的开头。反向之间的基本关系 迭代器及其对应的迭代器 i 由恒等式建立:
&*(reverse_iterator(i)) == &*(i - 1).

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

为什么 std::list 上的 Push_back 会更改使用 rbegin 初始化的反向迭代器? 的相关文章

随机推荐

  • 从 C# Windows 窗体在 MS Word 中打开 MS Word 文档

    我希望能够通过单击表单上的按钮 从 C 表单中打开 MS Word 中已制作的 Word 文档 但不知道如何操作 请帮忙 Thanks 上次我使用 Excel 时 我使用以下代码打开它 Process Start FileLocation
  • 使用ExternalContext.redirect()将面孔消息添加到重定向页面

    我在用ExternalContext redirect String 将用户重定向到另一个页面的方法 FacesContext getCurrentInstance addMessage new FacesMessage Bla bla b
  • java.lang.NoClassDefFoundError:无法解析:Landroid/webkit/PacProcessor

    实在找不到言语 我的项目只是一天天都无法编译 这就是我所做的 我下载并显示一个 PDF 然后将其作为保存的 PDF 打印到设备上 然后崩溃了 这是崩溃的情况 at java lang Class java lang Class classF
  • 将预处理器宏添加到 xcode 6 中的目标

    也许这非常简单 但我找不到在 Xcode 6 中为目标定义预处理器宏的方法 我已经做了一个屏幕截图来显示它在 Xcode 中的位置 因为它更容易 选择项目文件 选择您想要的目标 转到构建设置 搜索 预处理器 添加用于调试 发布或两者的预处理
  • Apache Spark:在分区上并行应用 sklearn 的函数

    我是大数据和 Apache Spark 的新手 也是一名在导师指导下工作的本科生 是否可以将函数 即样条曲线 仅应用于 RDD 的分区 我正在尝试实现论文中的一些工作here http sites stat psu edu rli rese
  • onBackPressed 功能在 IMMERSIVE STICKY 模式下不起作用

    我正在使用沉浸模式进行带有 videoView 的活动 我的目标是当触摸屏幕时 媒体控制器和系统控制栏一起显示或消失 现在一切正常 问题是我无法正常离开活动 当我按一次后退按钮时 系统栏再次隐藏 什么也没有发生 我必须按两次才能退出活动 我
  • Cython 类执行同类 cython 类列表

    我定义了一个泛型类Rule在 Cython 中 它期望cdef方法initialize 我创建了一个类 它本身定义为Rule 但它执行initialize规则列表的方法 cython cdef class Rule cdef initial
  • cells().paste VS cells.pastespecial?

    下面的代码是如何工作的 Range D4 F4 copy cells 1 1 PasteSpecial 虽然下面不起作用 Range D4 F4 copy cells 1 1 Paste 我意识到正确的语法是 Range D4 F4 cop
  • pctl(PR_SET_PDEATHSIG) 竞争条件

    据我了解 当父进程死亡时终止子进程的最佳方法是通过prctl PR SET PDEATHSIG 至少在 Linux 上 父进程退出后如何让子进程终止 https stackoverflow com questions 284325 how
  • JQMIGRATE:jQuery.fn.offset() 需要连接到文档的元素

    我有一个使用 jquery 1 x 的网站 现在 我开始在这个网站中使用 jquery 3 x 为了解决任何迁移问题 我已经安装了 JQMigrate 它在控制台窗口中显示的消息之一是 JQMIGRATE jQuery fn offset
  • ClearFix 与溢出[重复]

    这个问题在这里已经有答案了 这是标准浮动问题 父容器 div 中有一堆浮动元素 由于子级是浮动的 父级不会扩展以包含所有子级 我了解clearfix解决方案以及将父容器div上的溢出属性设置为 自动 或 隐藏 http www quirks
  • 是否有内置的 .NET 异常指示非法对象状态?

    如果遇到非法状态 例如 只能调用一次的初始化方法第二次被调用 我应该抛出什么异常 我真的没有看到任何有意义的内置异常 这看起来应该是框架中的东西 我是不是戳错了地方 无效操作异常 http msdn microsoft com en us
  • 使用启动屏幕 (.xib) 会停止缩放

    据我了解 iOS 8 的应用程序应该有一个故事板文件作为启动屏幕而不是图像 我创建了一个非常简单的启动屏幕文件 它具有任意宽度和任意高度 并且有一个纯文本标签 上面写着 占位符 并将其设置为我的启动屏幕 然而 当我尝试在 iPhone 6
  • Postgresql 和 PHP:currval 是在多用户应用程序中检索最后一行插入的 id 的有效方法吗?

    我想知道我用来检索插入到 postgresql 表中的最后一行的 id 的方法是否有效 显然 它可以工作 但是当我有许多用户同时在同一个表中添加行时 引用串行序列 currval 值可能会出现问题 我的实际做法是 pgConnection
  • 使用 -fno-access-control 进行单元测试

    我见过许多在单元测试时访问私有变量的疯狂方法 我见过的最震撼人心的是 define private public 但是 我从未见过有人建议在编译器级别关闭私有变量 我一直以为你不能 我向许多开发人员抱怨说 如果您可以告诉编译器放弃这个文件
  • 找不到 androidx.camera:camera-view

    我正在开发一个基本的自定义相机应用程序 这些是我的依赖 CameraX core library dependency implementation androidx camera camera camera2 camera version
  • Eclipse CDT - 将静态资源文件复制到 bin_dir

    所以我的问题是 我在 Eclipse 3 5 上的 CDT 6 0 中有一个 C 项目 现在有一个静态资源文件 log4cxx 的 properties 需要复制到构建文件夹 该文件在运行时访问以配置 log4cxx 子系统 并且它需要与可
  • 更改 QT 主窗口的标题字体

    我想知道如何更改 QT 主窗口的标题字体 请参阅随附的屏幕截图 我尝试更改样式表等 但它不起作用 我也尝试使用 C 发送消息 但这也有效 SendMessage form gt effectiveWinId WM SETFONT WPARA
  • 使用 Angular 将对象写入 .json 文件?

    我有一个像这样的对象 text Address of Bowlers game center in Chennai entities entity action value business entity intent value fetc
  • 为什么 std::list 上的 Push_back 会更改使用 rbegin 初始化的反向迭代器?

    根据我发现的一些 STL 文档 在 std list 中插入或删除元素不会使迭代器失效 这意味着允许循环列表 从begin to end 然后使用push front添加元素 例如 在下面的代码中 我用元素 a b 和 c 初始化一个列表