C++中STL容器的迭代器经过各种操作后的状态
1. vector
1) erase
主要代码如下,其中showvector为遍历容器输出所有元素的函数。
int main()
{
vector<int> a = {0, 1, 2, 3, 4, 5};
vector<int>::iterator it;
it = a.begin() + 3;
showvector(a);
cout << *it << endl;
a.erase(a.begin() + 1);
showvector(a);
cout << *it << endl;
system("PAUSE");
return 0;
}
删除的是迭代器之前的元素:指向下一个元素。
删除的是迭代器本身指向的元素:指向下一个元素。
删除的是迭代器之后的元素:指向的元素不变。
it = a.erase(a.begin()+4);
其中,erase的返回值为移除的元素的下一个元素的迭代器。
小结:对于vector而言,进行erase操作后,迭代器可以类比数组(迭代器相当于偏移地址)。将erase操作视为移除某个元素,将其所有元素向前挪一位来填补这个空缺。
2)insert
int main()
{
vector<int> a = {0, 1, 2, 3, 4, 5};
vector<int>::iterator it;
it = a.begin() + 3;
showvector(a);
cout << *it << endl;
a.insert(a.begin() + 1, 9);
showvector(a);
cout << *it << endl;
system("PAUSE");
return 0;
}
插入在迭代器之前:
迭代器失效。
插入在迭代器之后:
迭代器失效。
小结:一插就失效。建议将insert的返回值赋给迭代器。
it = a.insert(a.begin() + 4, 9);
其中,insert的返回值为插入元素的迭代器。
2. list
1) erase
int main()
{
list<int> b = {0, 1, 2, 3, 4, 5};
list<int>::iterator it2, it3;
it3 = it2 = b.begin();
advance(it2, 3);
advance(it3, 2);
showlist(b);
cout << *it2 << endl;
b.erase(it3);
showlist(b);
cout << *it2 << endl;
system("PAUSE");
return 0;
}
分别删除指定迭代器之前和之后的元素:指向的元素都不变。
小结:list的结构类似链表,删除只是改变了指针指向的地址,原本迭代器指向的元素不会改变。
it2 = b.erase(it3);
其中,erase返回的是删除的元素的后继元素。
2) insert
int main()
{
list<int> b = {0, 1, 2, 3, 4, 5};
list<int>::iterator it2, it3;
it3 = it2 = b.begin();
advance(it2, 3);
advance(it3, 2);
showlist(b);
cout << *it2 << endl;
b.insert(it2, 9);
showlist(b);
cout << *it2 << endl;
system("PAUSE");
return 0;
}
分别插入到对应迭代器之前和之后: 指向元素都不变。
it2 = b.insert(it3, 9);
其中,insert返回插入的元素的迭代器。
小结:类似erase操作。
3. 待拓展
总结(待拓展)
容器类型\操作类型 | erase | insert | 待拓展 |
---|---|---|---|
vector | 删除之前或本身,指向后继元素;删除之后的元素,不变 | 失效 | |
list | 指向元素不变 | 指向元素不变 | |
待拓展 |