当前位置: 首页 > 知识库问答 >
问题:

向量重新分配后迭代器如何更新

万俟浩
2023-03-14

这是我正在查看的代码片段:

vector<int> iv = {1,2,3,4,5,6,7,8,9,10};
auto iter = iv.begin(), mid = iv.begin() + iv.size()/2;
for(int count = 100; count; --count ) {
    iter = iv.insert(iter, - 1);
    cout << "capacity = " << iv.capacity() << "*mid = " << *mid << endl;

}

根据迭代器无效规则:
向量:插入点之前的所有迭代器和引用不受影响,除非新容器大小大于以前的容量(在这种情况下,所有迭代器和引用都无效)[23.2.4.3/1]迭代器无效规则

我明白,由于我在每个插入操作中重新分配iter的值,也许我能够保持它的有效性(如果我错了,请纠正我)。然而,迭代器“中间”在这种情况下仍然有效,即使我没有在循环中篡改它,而且当向量的容量发生变化时也是如此。

那么,“mid”如何在重新分配后进行自我更新呢?

为了知道mid是否在改变,我将代码中的第4行更改为:

iv.insert(iter, -1); // Did not assign it back to iter.

打印在mid处取消参考值的结果表明发生了变化,可能还表明iter无效。(再说一遍,如果我错了,请纠正我)。

共有1个答案

阴元青
2023-03-14

你的理解是正确的。一旦容量增加,任何迭代器都将失效。即使容量没有改变,mid迭代器也会失效,但它基本上指向前一个元素。

因此,最初的代码至少可以在iter中使用,然而mid在第一次插入时将变得不可用。经过修改,代码完全无效。

通常,vector迭代器的实现只是一个简单的指针,指向支持数组的某个元素。因此,当容量改变和数组重新分配时,任何这样的迭代器都不再有效,因为指针指向不再有效的内存。因此,您可能会看到垃圾、分段错误或随机看到正确的值。当容量不变时,数组中的元素可以向前移动,以便在插入点之后的迭代器中看到前一个元素,但前提是数组开头没有空元素(例如,start大于零)。但所有这些都是特定于实现的,因此标准明确规定,上述大多数行为都是未定义的行为。

 类似资料:
  • 本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。

  • 我从git上的一个迭代分支中拆出了自己的开发分支,第二天迭代分支上有其他同事合上去的代码,我应该如何更新这些新代码?

  • 问题内容: 无论如何,要使python列表迭代器向后移动? 基本上我有这个 运行以下代码将产生输出: 我知道为什么它会给我输出,但是有没有办法我可以在str()方法中向后退一步呢? 编辑 好吧,也许可以更清楚地说明这一点。我不想做一个完全相反的事情,基本上我想知道是否有一种简单的方法可以等效于python中的 双向 迭代器? 问题答案: 不,通常您不能使Python迭代器向后移动。但是,如果您只想

  • 问题内容: 如何从最后一项到第一个迭代一个项目? 问题答案: 如果要继续使用集合,可以使用以下方法: 如果您可以改用数组,则可以看一下answer。

  • 从for循环讲起 我们在控制语句里学习了Rust的for循环表达式,我们知道,Rust的for循环实际上和C语言的循环语句是不同的。这是为什么呢?因为,for循环不过是Rust编译器提供的语法糖! 首先,我们知道Rust有一个for循环能够依次对迭代器的任意元素进行访问,即: for i in 1..10 { println!("{}", i); } 这里我们知道, (1..10) 其本身

  • 下面的代码尝试迭代excel文件,并将数据加载到