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

lwx*_*ted 2 c++ iterator stl vector

对于vSTL中的向量,存储v.end()(例如vector :: iterator)以供以后使用是否安全?我能保证当我以后使用存储的迭代器时,它仍然会指向同一个位置吗?

考虑以下向量v:
1, 2, 3, 4, 5

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

我现在能放心*it == 6吗?

Mar*_*dik 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. 
Run Code Online (Sandbox Code Playgroud)

  • 在C++ 11中,只有当新大小大于旧容量时,迭代器才会失效. (3认同)