Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以安全地依赖迭代器的v.end()的位置吗?_C++_Vector_Stl_Iterator - Fatal编程技术网

C++ 我们可以安全地依赖迭代器的v.end()的位置吗?

C++ 我们可以安全地依赖迭代器的v.end()的位置吗?,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,对于STL中的向量v,存储v.end()(例如向量::迭代器)以供以后使用是否安全?我是否可以保证在以后使用存储的迭代器时,它仍然指向相同的位置 考虑以下向量v: 1,2,3,4,5 现在我存储了std::vector::iterator it=v.end()。稍后,我将两个新元素推入向量,之后它看起来像: 1,2,3,4,5,6,7 我现在可以确信,*it==6?否。 将某物推入std::vector后,end()迭代器总是无效 除非 新容器的大小大于以前的容量 但是,有些容器的迭代器在推送

对于STL中的向量
v
,存储
v.end()
(例如向量::迭代器)以供以后使用是否安全?我是否可以保证在以后使用存储的迭代器时,它仍然指向相同的位置

考虑以下向量
v

1,2,3,4,5

现在我存储了
std::vector::iterator it=v.end()
。稍后,我将两个新元素推入向量,之后它看起来像:
1,2,3,4,5,6,7

我现在可以确信,
*it==6

否。

将某物推入
std::vector
后,
end()
迭代器总是无效

除非

新容器的大小大于以前的容量


但是,有些容器的迭代器在推送之后不会失效。请参阅对的优秀答案


如果要在推送新元素时使用迭代器记住向量中的位置,可以使用
reserve()
成员确保新大小不大于旧容量

std::vector<int> numbers = {1,2,3};
numbers.reserve(4);
int capacity = numbers.capacity();  // capacity >= 4
std::vector<int>::iterator pos = numbers.begin() + 2 // any iterator before
                                                     // the point of insertion
numbers.push_back(4); // new size is 4, old capacity is >= 4, 
                      // therefore pos is still valid. 
std::向量数={1,2,3};
数目.储备(4);
int capacity=numbers.capacity();//容量>=4
std::vector::iterator pos=numbers.begin()+2//之前的任何迭代器
//插入点
数字。向后推(4);//新尺寸为4,旧容量大于等于4,
//因此,pos仍然有效。

§23.3.6.5/1[向量修饰符]

如果新容量大于旧容量,则会导致重新分配。如果没有重新分配, 插入点之前的所有迭代器和引用都保持有效

它没有明确说明,但这意味着插入点处和之后的所有迭代器、引用都将无效。这包括
end
迭代器。本节专门介绍插入/推回,但在擦除等方面仍然或多或少准确

§23.3.6.3/5[向量容量]

重新分配使引用元素的所有引用、指针和迭代器无效 按顺序。可以保证,在之后发生的插入期间不会发生重新分配 对reserve()的调用,直到插入使向量的大小大于 容量()的值


谢谢,那么记住向量中的位置的唯一方法就是使用数组索引记住位置,如果我要将额外的元素推入向量?@lwxted。或者使用一个
std::list
,它的迭代器在推送额外的元素后不会失效。在C++11中,只有当新的大小大于旧的容量时,迭代器才会失效。@BrianBi:但是插入点之后的迭代器也会失效,对吗?结束迭代器在任何插入点之后。@MartinDrozdik:结束迭代器的过去总是无效的,这部分是正确的。这是下一个关于其他迭代器的陈述,它是向后的。我在回答中犯了一个小错误,但我改正了它。查看编辑后的答案。因此,只有重新分配才能使向量迭代器无效(推回后)?所有向量修改器(插入/擦除/推回/保留/调整大小等)都可以使向量迭代器无效。将其编辑到帖子中