- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
刚才,我正在阅读 Josuttis 的 STL 书。
据我所知——c++ vector 是一个可以重新分配的 c 数组。所以,我明白了,为什么在 push_back() 之后所有的迭代器和引用都会变得无效。
但我的问题是关于 std::deque。据我所知,它是大块数组(c 数组的 c 数组)。所以 push_front() 在开头插入元素,如果没有空间,deque 分配新 block ,并将元素放在已分配 block 的末尾。
在中间的 insert() 之后,所有引用和迭代器都变得无效,我明白为什么——所有元素都被移动了。但我真的误解了短语“...在 push_back() 和 push_front() 之后所有引用都保持有效,但迭代器不有效”(相同的短语可以在 @ standard:23.2.2.3 中找到)
这是什么意思?!如果引用有效,则双端队列无法重新分配(== 移动)其元素。那么为什么迭代器会失效呢?为什么我不能在插入非移动元素后使用它们?或者这句话的意思是,我不能确定迭代器是否等于 begin() 或 end() 和溢出?
另外,我想提一下,在 erase() 之后,所有迭代器和引用都保持有效(删除的除外 :-))。
PS:请不要以“标准”形式回答:“它不能使用,因为 THE STANDARD 是这么说的”。我想了解原因,会发生什么。
最佳答案
我认为迭代器失效但引用未失效的原因可能是因为双端队列实现了指向存储元素的双端队列页面的指针数组。对双端队列中元素的引用将直接引用“页面”中的元素。但是,双端队列中的迭代器可能依赖于指向各个页面的指针 vector 。
在双端队列的一端或另一端插入一个新元素永远不需要重新分配和移动现有数据页,但它可能需要添加到(并因此重新分配和复制)页面指针数组,使任何依赖于的迭代器无效前一个页面指针数组。
Array of pointers
(if this grows Data Pages
and gets copied, (these never move
iterators are invalid) due to insert at ends)
----------------- --------------------
+----------+ +----------+
| -+-------------->| |
+----------+ +----------+
| -+---------+ | |
+----------+ | +----------+
| -+---+ | | |
+----------+ | | +----------+
| |
| |
| |
| | +----------+
| +---->| |
| +----------+
| | |
| +----------+
| | |
| +----------+
|
| +----------+
+---------->| |
+----------+
| |
+----------+
| |
+----------+
关于C++ deque 的迭代器在 push_front() 之后失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658956/
我有一个充满特定数字的链表,称为 intList。什么会 intList.push_front(2 * intList.back()); 对我的 list 做什么? 最佳答案 它会在列表的前面加上列表
如何将单向链表的push_front()方法实现为它的成员函数?下面的代码无法编译(错误:左值需要作为赋值的左操作数),因为您不能为this 指针赋值。有什么办法解决这个问题? #include us
我正在尝试对 C++ 双端队列实现推送前端方法。我这样做的方式是移动数组的每个元素。它有效,但我的程序最后崩溃了!在我的推送前端方法中,我似乎“运行超过我的数组末尾”,导致堆损坏错误、调试断言,那些事
我有一个 std::deque> rooms我正在迭代: for(auto row : rooms) { row.push_front(new Room()); } 但出于某种原因,它只是用
这个问题在这里已经有了答案: Iterator invalidation rules for C++ containers (6 个答案) 关闭 7 年前。 std::forward_list fo
我无法让我的 push_front 正常工作。 new_head->next = head 似乎无法正确链接 new_head 和 head。我的节点类是通常的节点类,其中 next 是节点指针。我的
我正在使用 SDL 开发 GUI。我创建了一个从属/主类,其中包含指向它自己的从属的指针的 std::list 以在 GUI 中创建层次结构(包含按钮的窗口。按钮标签等)。它工作了好一阵子,直到我编辑
在用 C++ 实现基本 vector 时,我在 push_front 问题(下)中遇到问题 _Alloc 是分配器类,content_ 是指向数据的指针,size_ 和capacity_ 是他们所说的
我正在尝试在我创建的类列表上使用 push_front() 函数。我把它放在一个 for 循环中,但是每当循环将新成员插入列表时,它就会立即自动销毁,我假设是因为它超出了范围。我的问题是如何永久添加这
我已经尝试环顾四周并尝试了所有解决方案,但我似乎无法解决我的问题。我知道我在 push_front 线上遇到了段错误,但我只是迷路了。这是代码- #include #include #includ
刚才,我正在阅读 Josuttis 的 STL 书。 据我所知——c++ vector 是一个可以重新分配的 c 数组。所以,我明白了,为什么在 push_back() 之后所有的迭代器和引用都会变得
我正在阅读这里: http://www.cplusplus.com/reference/deque/deque/push_back/ 对于 void push_back (const value_ty
我正在编写一个 2-way Intlist,其中每个节点都有对其上一个和下一个节点的引用。一切似乎都很好,但是当我使用 Push_front() 方法在开头添加节点时,它们没有上一个引用。 list.
我正在编写一个名为 Playlist 的类,它对 PlaylistNodes 执行不同的操作。我在网上看了看并尝试实现push_back和push_front方法,但我没有成功。 PlaylistNo
我有一个类,我想使用标准库列表来存储它们的列表。我基本上想要 push_front() 列表。所以我的代码是这样的: #include /* ... lots of stuff ...*/ comp
Java 中有没有实现push_back() 和push_front() 方法的集合类? 最佳答案 类(class)java.util.LinkedList有 addFirst/Last()、getF
这个问题在这里已经有了答案: Why no push/pop in front of vector? (4 个答案) 关闭 4 年前。 既然std::vector::push_back()存在,为什
我正在使用 Boost.MPL,我有一个编译时列表 ( boost::mpl::list )。当我推回一个元素时,我得到的东西可能等同于一个列表,但不是 boost::mpl::list。 . #in
如标题所示。 我对双端队列的理解是它分配了“ block ”。我看不出分配更多空间如何使迭代器无效,如果有的话,人们会认为双端队列的迭代器比 vector 的保证更多,而不是更少。 最佳答案 C++
此代码编译失败: 类声明: class threadController { private: static std::forward_list threadList; stati
我是一名优秀的程序员,十分优秀!