目录
一:vector的迭代器是什么?
二:什么的迭代器失效?
三:什么引起迭代器失效?
(1) 扩容操作可能会引起迭代器失效
(2)vector之中的删除方法
(3)swap()/clear(),也会引起迭代器失效。
四:如何解决迭代器失效?
一:vector的迭代器是什么?
vecto迭代器是原生态类型的指针,所谓原生态类型的指针就是vector中存储的什么类型的数据,那么vector迭代器就是什么类型的指针。
二:什么的迭代器失效?
迭代器失效,那么可以认为是指针失效,如果指针失效则是指针指向了一段非法的空间,说明该空间已经被释放了。
三:什么引起迭代器失效?
vector的迭代器失效,便是指针失效,由此可以推出是vector中的空间改变了引起的迭代器失效,那么便是vector中的接口操作改变了vector中的空间,在此归类出三种可能会引起迭代器失效的操作:
(1) 扩容操作可能会引起迭代器失效
vector中涉及到扩容的接口方法:resize() / reserve() / push_back() / insert() / assign() /
下面演示push_back()方法引起迭代器失效:
void TestVector() {
vector v{ 1,2,3,4,5 };
auto it = v.end();
v.push_back(5);
cout << *it << endl;
}
引起迭代器失效:
(2)vector之中的删除方法
删除之后,pos的迭代器就失效了,我使用vs编译器,通过erase() 方法删除之后,vector的迭代器就失效了,演示如下:
vectorv{ 1,2,3,4,5 }; auto it = v.begin(); while (it != v.end()) { v.erase(it); }
引起迭代器失效:
(3)swap()/clear(),也会引起迭代器失效。
四:如何解决迭代器失效?
在有可能引起迭代器失效的位置,重新对迭代器进行赋值。
void TestVector() {
vector v{ 1,2,3,4,5 };
auto it = v.begin();
while (it != v.end()) {
v.erase(it);
it = v.begin();
}
}
这样便可以解决迭代器失效的问题。



