迭代器与反向迭代器

来源:互联网 发布:淘宝订单贷款 编辑:程序博客网 时间:2024/05/19 10:08

这里以链表为例:直接上代码,解释理解起来比较容易

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

void Show(int n_Value){
cout<<n_Value<<" ";
}

int main(){
list<int> list1;
list1.push_back(1);
list1.push_back(2);
list1.push_back(3);
list1.push_back(4);
list1.push_back(5);
list1.push_back(3);

/*1. begin() end()和front() back()之间的区别:
begin和end返回的是一个迭代器(即一个指针)而front和back返回的是头尾的内容(返回一个值)
*/
cout<<*(list1.begin())<<" "<<*(--(list1.end()))<<endl;//由于end指向list最后元素的下一个元素,由此需要--
cout<<list1.front()<<" "<<list1.back()<<endl;

::for_each(list1.begin(),list1.end(),&Show);
cout<<endl;
/*2.注意:添加、删除操作时迭代器需要进行重新赋值:下面代码是实现删除表中所有相同元素*/
//list<int>::iterator ite=list1.begin();
//while (ite!=list1.end())
//{
// if(*ite==3){
// ite=list1.erase(ite);//添加、删除操作时迭代器需要进行重新赋值 --本句得到的ite是3的下一个,所以该句本身就实现了ite++操作
// }else
// ite++;
//}
//::for_each(list1.begin(),list1.end(),&Show);

/*反向迭代器的使用:反向迭代器中删除一个元素时,需要首先将其转换成正向迭代器,注意:转换的时候有一个位移偏差,需要进行相应调整。原因是,
begin指向list(双向链表)首元素,end指向链表末尾元素的下一个元素。而rbegin指向末尾元素,rend指向首元素的前一个元素
*/
list<int>::reverse_iterator rev_ite=list1.rbegin();
while (rev_ite!=list1.rend())
{
if(*rev_ite==3){
list<int>::iterator ite=--(rev_ite.base());//转成正向1-[反向的开始是正向的尾,该反向转换后会指向尾元素的下一个元素,由此进行--偏移操作],再进行一个位置的偏移量
//list<int>::iterator ite=(++rev_ite).base(); //转成正向2-不推荐使用这个,因为rev_ite已经移动了
//cout<<*ite;
list1.erase(ite);
break;
}
++rev_ite;
}
::for_each(list1.begin(),list1.end(),&Show);

}

1 0
原创粉丝点击