什么是迭代器?
迭代器本质就是STL中遍历容器的一种“工具”,不同的容器的迭代器实现各不相同,但功用都是用于遍历容器中的数据。
简单了解过string,vector与list的底层实现后我们便可以知道,string和vector的迭代器都是属于原生指针,而list的迭代器则是一个封装了结点的结构体
举个简单点的例子吧,vector的迭代器实现大致如下
底层就是一个T*类型(自定义类型)的指针
template <typename T>
class vector
{
public:
// Vector的迭代器是一个原生指针
typedef T *iterator;
typedef const T *const_iterator;
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
const_iterator begin() const
{
return _start;
}
const_iterator end() const
{
return _finish;
}
private:
iterator _start; // 指向数据块的开始
iterator _finish; // 指向有效数据的尾
iterator _end_of_storage; // 指向存储容量的尾
};
那么什么是迭代器失效呢?
vector容器的迭代器失效主要分两种
- 扩容导致迭代器成为野指针而导致失效
- 插入或删除元素后迭代器指向的并非原先指向的元素
list容器的迭代器失效主要即删除结点导致迭代器失效
故此,insert/erase后的迭代器都可能失效
所以原则上,插入和删除数据后不要再去访问原先迭代器
- 在vs运行环境下,删除元素后不允许再访问该迭代器,因为该迭代器被认为是已失效的迭代器
- Linux环境下删除元素后可以允许访问该迭代器
解决方式
- insert函数插入元素后返回指向该元素的迭代器
- erase函数删除元素后则返回删除元素的下一个元素的迭代器