【问题标题】:Container Operations that Invalidate Iterators使迭代器无效的容器操作
【发布时间】:2022-12-31 14:31:16
【问题描述】:

我目前正在学习 C++,正在阅读 C++ Primer 第 5 版,我必须:
9.3.6.容器操作可能会使迭代器无效我的问题是关于双端队列,我问 chatgpt 向我解释这个问题,他给了我第二个选择,但书上另有说法, 我想也许这本书有点过时了,想听听有经验的人的意见。 什么是正确的 1 / 2 ?

  1. 如果 删除的元素在除正面或背面以外的任何地方。如果我们删除元素 双端队列的后面,尾端迭代器无效但其他迭代器, 引用和指针不受影响;如果我们删除它们也不受影响 从前面。

  2. 如果在双端队列中的任何位置插入或删除元素,则迭代器、指针和对双端队列中元素的引用可能会变得无效,而不仅仅是在前面或后面插入元素或从中间删除元素时。这是因为双端队列将它们的元素存储在链接在一起的多个内存块中,插入或删除元素可能需要双端队列分配或释放新的内存块。如果发生这种情况,现有的迭代器、指针和对双端队列中元素的引用可能会变得无效,因为它们将不再指向内存中的正确位置。

    从一本书中学习,试图理解什么是正确的,如何使用双端队列以及在双端队列类型的容器中添加或删除元素时会发生什么。

【问题讨论】:

  • 不应依赖 ChatGPT 做任何事情。它总是会给出一个自信的答案,而答案往往是错误的。
  • 咨询cppreference:12。这本书似乎是正确的。

标签: c++ containers


【解决方案1】:

请参考(惊人的)网站:cppreference.com

根据 cppreference,std::dequepop_back()pop_front() 不会使迭代器无效,但 erase() 会(但不总是)。

【讨论】:

  • erase() 并不总是使迭代器无效。
  • 感谢您指出,我更新了措辞。
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 2012-04-24
  • 2011-10-22
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多