C++迭代器

迭代器是什么呢?迭代器就是可以以一个对象表现出容器元素的位置,实践这个概念的对象就是所谓的迭代器(结点的指针)。迭代器是一个可遍历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;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值