STL進階--狡猾的反向迭代器
阿新 • • 發佈:2019-01-01
反向迭代器
兩種宣告反向迭代器的方法
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}