一、迭代器作用
在设计模式中有一种模式叫迭代器模式,提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素。
这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,就可以对不同容器进行相同的操作。迭代器就是一种指针。
以下以算法find为例,展示了容器、算法和迭代器如何合作:
template<typename InputIterator, typename T>
InputIterator find(InputIterator first, InputIterator last, const T &value)
{
while (first != last && *frist != value)
++first;
return first;
}
从以上代码可以看到,算法通过传入的迭代器,顺序访问容器中的元素,寻找并返回符合条件的元素。通过向算法传入指向不同容器的迭代器,实现了算法以相同的逻辑对不同容器的访问。
二、 迭代器的重要特性
迭代器是一种智能指针,它将指针进行了一层封装,既包含了原生指针的灵活和强大,也加上很多重要的特性。
(1)操作符重载
迭代器对指针的一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的数据结构。
代码如下:
template<typename T>
class Iterator
{
public:
Iterator& operator++();
//...
private:
T *m_ptr;
};
对于不同的数据容器,以上Iterator类中的成员函数operator++的实现会各不相同,
1)数组
对于数组的可能实现如下:
//对于数组的实现
template<typename T>
Iterator& operator++()
{
++m_ptr;
retrun *this;
}
2)链表
对于链表,它会有一个类似于next的成员函数用于获取下一个结点,其可能实现如下:
//对于链表的实现
template<typename T>
Iterator& operator++()
{
m_ptr = m_ptr->next();//next()用于获取链表的下一个节点
return *this;
}