C++之itertor迭代器

一、迭代器简介

  迭代器是一种检查容器内元素并遍历元素的数据类型。

  标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作(例如list链表模板没有支持下标操作)。

  各容器类都定义了自己的itertor类型,用于访问容器内的元素。换句话说:每个容器都定义了一个名为itertor的类型,而这种类型支持迭代器的各种操作。

1.begin和end操作

  每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。

  如果容器中有元素的话,由begin返回的迭代器指向第一个元素;由end操作返回的迭代器指向末端元素的下一个;如果容器为空,begin返回的迭代器与end返回的迭代器相同。由end操作返回的迭代器并不指向容器中任何实际的元素,相反、它只是起一个哨兵的作用,表示我们已处理完容器中的所有元素。

2.迭代器的自增和解引运算

  迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。

  迭代器类型可使用解引操作符(*)来访问迭代器所指向的元素;解引用操作符返回迭代器当前所指向的元素。

  迭代器使用自增操作符向前移动迭代器指向容器中下一个元素;由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。

3.迭代器的其他操作

  另一个可执行于迭代器的操作就是比较:用==或!=操作符比较两个迭代器,如果两个迭代器指向同一个元素,则他们相等,否则就不相等。

4.迭代器的算数操作

  除了一次移动迭代器的一个元素的增量操作符外,迭代器还支持其他的算数操作。可以对迭代器对象加上或减去一个整形值。这样做将产生一个新的迭代器,其位置在迭代器所指元素之前(加)或之后(减)n个元素的位置。

二、实例

1.遍历和查找

Program_Info mProgramInfo;
int currIndx = this->currIndx;
list<ChannelInfo*>::iterator mChannelInfo;
mChannelInfo = this->channelList.begin(); //list<ChannelInfo*> channelList;
for(int i = 0; i < currIndx; i++,mChannelInfo++){}
DvbcChannelInfo* dvbChannelInfo = (DvbcChannelInfo*)(*mChannelInfo);
mProgramInfo.number =  dvbChannelInfo->getChannelNumber();

2.交换和move

//move
if(progSourcePos -progTargetPos < 0)
{
  list<ChannelInfo*>::iterator sChannelInfo;
  sChannelInfo = this->channelList.begin();
  for(int i = 0; i < progSourcePos; i++,sChannelInfo++){}
  //
  list<ChannelInfo*>::iterator tChannelInfo;
  tChannelInfo = this->channelList.begin();
  for(int i = 0; i < progTargetPos; i++,tChannelInfo++){}
  ///
  this->channelList.insert(++tChannelInfo,(*sChannelInfo)); //在target后插入source
  this->channelList.erase(sChannelInfo); //删除原有source
}
else if(progSourcePos -progTargetPos > 0)
{
  20140626
  list<ChannelInfo*>::iterator sChannelInfo;
  sChannelInfo = this->channelList.begin();
  for(int i = 0; i < progSourcePos; i++,sChannelInfo++){}
  //
  list<ChannelInfo*>::iterator tChannelInfo;
  tChannelInfo = this->channelList.begin();
  for(int i = 0; i < progTargetPos; i++,tChannelInfo++){}
  /
  this->channelList.insert(tChannelInfo,(*sChannelInfo)); //在target前插入source
  this->channelList.erase(sChannelInfo); //删除原有source
}
//swap
list<ChannelInfo*>::iterator sChannelInfo;
sChannelInfo = this->channelList.begin();
for(int i = 0; i < progSourcePos; i++,sChannelInfo++){}
DvbcChannelInfo* sourcedvbChannelInfo = (DvbcChannelInfo*)(*sChannelInfo);
ALOGD("TK------>>>>>swapProgram>>>>>tmpsource->getServiceName is %s\n",(*sChannelInfo)->getServiceName());
//
list<ChannelInfo*>::iterator tChannelInfo;
tChannelInfo = this->channelList.begin();
for(int i = 0; i < progTargetPos; i++,tChannelInfo++){}
DvbcChannelInfo* targetdvbChannelInfo = (DvbcChannelInfo*)(*tChannelInfo);
ALOGD("TK------>>>>swapProgram>>>>*tChannelInfo is 0x%lx\n",*tChannelInfo);
/ 
this->channelList.insert(sChannelInfo,targetdvbChannelInfo); //在sChannelInfo迭代器前插入target 
this->channelList.erase(sChannelInfo); //删除source
//
this->channelList.insert(tChannelInfo,sourcedvbChannelInfo); //在tChannelInfo迭代器前插入source
this->channelList.erase(tChannelInfo); //删除target


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值