迭代器與反向迭代器

這裏以鏈表爲例:直接上代碼,解釋理解起來比較容易

#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);

}

發佈了77 篇原創文章 · 獲贊 110 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章