1. 程式人生 > >STL進階--狡猾的反向叠代器

STL進階--狡猾的反向叠代器

() begin 產生 刪除 != ins bubuko 聲明 不同

反向叠代器

兩種聲明反向叠代器的方法

reverse_iterator<vector<int>::iterator> ritr;
vector<int>::reverse_iterator ritr;

用反向叠代器遍歷

vector<int> vec = {4,5,6,7};
reverse_iterator<vector<int>::iterator> ritr;
for (ritr = vec.rbegin(); ritr != vec.rend(); ritr++)
   cout << *ritr << endl;   // prints: 7 6 5 4

叠代器<-->反向叠代器轉換

vector<int>::iterator itr;
vector<int>::reverse_iterator ritr;

ritr = vector<int>::reverse_iterator(itr);    //叠代器-->反向叠代器

itr = vector<int>::iterator(ritr);  // 編譯錯誤
itr = ritr.base();      //返回什麽?

// C++標準說: base()返回當前的叠代器

例子

vector<int> vec = {1,2,3,4,5};
vector<int>::reverse_iterator ritr = find(vec.rbegin(), vec.rend(), 3);


cout << (*ritr) << endl;   // 3

vector<int>::iterator itr = ritr.base();  

cout << (*itr) << endl;   // 4 

技術分享圖片

使用正向叠代器和反向叠代器可能產生不同的結果

//插入,結果一樣
vec = {1,2,3,4,5};
ritr = find(vec.rbegin(), vec.rend(), 3);

//Inserting
vec.insert(ritr, 9);         // vec: {1,2,3,9,4,5}
// or
vec.insert(ritr.base(), 9);  // vec: {1,2,3,9,4,5}


vec = {1,2,3,4,5};
ritr = find(vec.rbegin(), vec.rend(), 3);

// 刪除,結果不同
vec.erase(ritr);    // vec: {1,2,4,5}  
// or
vec.erase(ritr.base());    // vec: {1,2,3,5}  

STL進階--狡猾的反向叠代器