C++迭代器

来源:互联网 发布:易酷cms包含漏洞维护 编辑:程序博客网 时间:2024/06/11 23:36

迭代器是什么呢?迭代器就是可以以一个对象表现出容器元素的位置,实践这个概念的对象就是所谓的迭代器(结点的指针)。迭代器是一个可遍历STL所有元素的对象。 (遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。)

迭代器对指针的一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力。

Opreator *:返回当前位置上的元素值。如果该元素拥有成员,可以通过迭代器以操作符->取用他们

Operator ++: 令迭代器前进至下一元素。大多数迭代器还可使用Operator--退至前一元素。 

Operator ==和!=: 判断两个迭代器是否指向同一个位置。 
Operator = 对迭代器赋值。

迭代器的成员函数:

所有容器类都提供一些成员函数使得迭代器能够遍历所有元素。

begin() 返回一个迭代器,指向容器起点,也就是第一元素的位置。 
end() 返回一个迭代器,指向容器终点。终点位于最末元素的下一位置。

先来简单实现一下它们:



我们来看一下一些基本操作的重载:


 

再来看一下其他功能的实现

template<class T>

class List

{

       typedefListNode<T> Node;

public:

       typedef__ListIterator<T> Iterator;

       List()

              :_head(newNode)

       {

              _head->_next= _head;

              _head->_prev= _head;

       }

 

       List(constT& x)

              :_head(newNode(x))

       {

              _head->_next= _head;

              _head->_prev= _head;

       }

       ~List()

       {

              Clear();

              delete_head;

              _head= NULL;

       }

       voidPushBack(const T& x)//增加一元素到链表尾

       {

              Node*tmp = new Node(x);

              Node*Prev = _head->_prev;

              Prev->_next= tmp;

              tmp->_prev = Prev;

 

              _head->_prev= tmp;

              tmp->_next= _head;

       }

       voidPushFront(const T& x)//增加一元素到链表头

       {

              Node*temp = new Node(x);

              Node*Next = _head->_next;

              Next->_prev= temp;

              temp->_next= Next;

 

              _head->_next= temp;

              temp->_prev= _head;

       }

       voidPopBack()//删除链表尾的一个元素

       {

              assert(_head->_next!= _head);

              Node*tmp = _head->_prev->_prev;

              Node*del = _head->_prev;

 

              tmp->_next= _head;

              _head->_prev= tmp;

 

              deletedel;

       }

       voidPopFront()//删除链表头的一个元素

       {

              assert(_head->_prev!= _head);

              Node*temp = _head->_next->_next;

              Node*dele = _head->_next;

 

              temp->_prev= _head;

              _head->_next= temp;

 

              deletedele;

       }

       IteratorErase(Iterator pos)//删除一个元素或一个区域的元素

       {

              assert(_head->_next!= _head);

              Node*del = pos._it;

              Node*Prev = del->_prev;

              Node*Next = del->_next;

              Prev->_next= Next;

              Next->_prev= Prev;

              deletedel;

              returnNext;

 

       }

       IteratorInserter(Iterator pos, const T& x)//在指定位置插入一个或多个元素

       {

              Node*tmp = new Node(x);

 

              Node*Prev = pos._it->_prev;

 

              Prev->_next= tmp;

              tmp->_prev= Prev;

 

              tmp->_next= pos._it;

              pos._it->_prev= tmp;

 

              returnpos;

       }

 

       IteratorBegin()//返回第一个元素的指针(iterator)

       {

              //returnIterator(_head->_next);

              return_head->_next;

       }

       IteratorEnd()//返回最后一个元素的下一位置的指针(list为空时end()=begin())

       {

              return_head;

       }

       Node*Back()//返回最后一元素的引用

       {

              return&(_head->_prev);

       }

       Node*Front()//返回第一个元素的引用

       {

        return &(_head->_next);

       }

       voidClear()//删除所有元素

       {

              Node*cur = _head->_next;

              Node*next = cur->_next;

              while(cur != _head)

              {

                     next= cur->_next;

                     deletecur;

                     cur= next;

              }

              _head->_next= _head;

              _head->_prev= _head;

       }

       boolEmpty()//判断是否链表为空

       {

              if(Begin() == End())

              {

                     return true;

              }

              return false;

       }

       size_tSize()//返回链表长度(size_t就是int型)

       {

              intcount = 0;

              Node*p = _head->_next;

              while(p )

              {

                     count++;

                     p= p->_next;

              }

              return count;

       }

      

private:

       Node*_head;

};

再去写自己想要实现的输出函数:

template<class T>

void PrintList(List<T>& l)

{}

在主函数中可以用a去调用实现各函数的功能:

       List<AA>a;

^_^欢迎大家指出其中的错误。

原创粉丝点击