一、迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作(例如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