STL:迭代器iterator

迭代器模式

迭代器模式:提供一种方法,使得外部可以依次访问内部的元素,而不需要明确其结构的内部实现。

STL的中心思想是:数据容器与算法分离,彼此独立设计,最后通过一定的融合技术将两者结合使用。

STL三大基本组件:容器、算法、迭代器


Iterator find(Iterator first,Iterator last,const T& val)
{
    
    while(first!=last && *first!=val)
    {
        first++;
    }
    return first;  //若没找到 将返回末尾的下一个 即 .end()

}

find算法无需知道具体的容器实现,而只要Iterator提供实现即可

STL的迭代器实现

STL迭代器是一种smart pointer :其能够像指针一样执行解指针* ->访问内部数据,同时支持迭代到下一个元素

以list为例,其一个参考的实现如下:

class listitem
{
public:
    int value() const{return val;}
    listitem* next()const{return _next;}
private:
    int val;
    int* _next;
    
};
class m_list
{
    void insert(int val);
    void insert_end(int val);
private:
    listitem* end;
    listitem* first;
    long size;
};

如何为list设计可以顺序访问的外衣,那么需要实现迭代器,当derefrence这个迭代器时,能够获取其指向的listitem对象,当递增迭代器时,指向下一个迭代器对象。

那么其参考实现如下:

class listiter
{
    listitem* ptr;
    listiter(listitem* p=NULL):ptr(p){}
    listitem& operator*()const {return *ptr;}
    listitem* operator->()const{return ptr;}
    listiter& operator++()
    {
        ptr=ptr->next();
    }
    listiter operator++(int k)
    {
        listitem* p=ptr;
        for(int i=0;i<k;i++)
            p=p->next();
        return p;
    }
    bool operator==(listitem& i)
    {
        return ptr==&i;
    }
     bool operator!=(listitem& i)
    {
        return ptr!=&i;
    }
};

迭代器分类

STL中迭代器共有5种基本实现

名称特点
InputIterator输入迭代器,可以对迭代器进行读取操作,通常作为函数参数
OutputIterator输出迭代器,可以对迭代器进行写入操作
ForwardIterator前向迭代器,可以对迭代器取下一个操作,因此可用于遍历操作
BidirectionalIterator双向迭代器,可以对迭代器进行两个方向移动操作
RandomAccessIterator随机访问迭代器,可进行随机定位

迭代器失效

针对地址可能发生变化的操作,迭代器可能失效

①关联式容器发生结构变化:如map,priority_queue的插入,由于内部采取红黑树和堆的结构实现,插入元素后,相应的结构发生变化,迭代器指向的元素地址失效

②顺序式容器扩容:以vector<>为例,其插入元素后发生扩容,那么原先迭代器指向的元素地址失效。

迭代器遍历

传统方式,可以根据容器的begin() end()来实现

 for(vector<int>::iterator it=arr.begin();it!=arr.end();it++)
 {
    visit(it);
 }

C++11新特性:自动类型推导和增强for循环

 for(auto it:arr)
 {
    cout<<*it<<endl;
 }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页