向容器中添加或删除元素都有可能会使容器的迭代器失效。
向容器添加元素后:
(1) vector和string:若存储空间重新分配,则迭代器全部失效。若存储空间没有重新分配,则指向插入位置之前的元素的迭代器仍有效,之后的元素的迭代器将会失效。
(2) deque:插入元素到除了首尾位置之外的任何位置,都会使迭代器、指针、引用失效。插入元素到首尾,迭代器会失效,指向原来元素的指针和引用仍有效。
(3) list和forward_list:迭代器、指针、引用仍然有效。
在容器中删除一个元素后:
(1) vector和string:指向被删除元素之前的迭代器、引用、指针仍有效。当我们删除元素时,尾后迭代器总是会失效。
(2) deque:在首尾位置之外的任何位置删除元素,迭代器、指针、引用都会失效。如果删除的是尾元素,那么尾后迭代器失效,其他迭代器、引用、指针仍有效。如果删除的是首元素,迭代器、指针、引用仍有效。
(3) list和forward_list:指向除删除元素外的其他元素的迭代器、指针、引用仍然有效。
// vector、string添加元素后,若存储空间被重新分配,则指向容器的迭代器、指针、引用都失效。
// v.front()、v.back()返回的是元素的引用,类型和元素类型一样
// v.begin()、v.end()返回的元素的位置,类型是迭代器,要得到元素的值需要解引用
// v.front()、v.back()和v.begin()、v.end()都能达到访问首尾元素的效果,但它们不一样
#include<iostream>
#include<vector>
#include<sstream>
#include<forward_list>
using namespace std;
int main() {
vector<int> v = {
0,1,2,3,4,5}; // 容器v
vector<int> &refv = v; // v的引用
vector<int> *p = &v; // v的指针
vector<int> *refp = &refv; // 引用的指针
auto v_front = v.front(); // v的首元素的引用
auto v_begin = v.begin(); // 指向v的首元素的位置
auto v_back = v.back(); // v的尾元素的引用
auto v_end = v.end(); // 指向v的尾元素的下一个位置
--v_end;
cout << "修改前"<<endl<<"v:"