How to erase an element from a vector using erase() and reverse_iterator? - GeeksforGeeks

10 Oct, 2019
Given a vector, the task is to erase an element from this vector using erase() and reverse_iterator.
Example:
Input: vector = {1, 4, 7, 10, 13, 16, 19}, element = 16
Output: 1 4 7 10 13 19

Input: vector = {99, 89, 79, 69, 59}, element = 89
Output: 99 79 69 59

Approach:
Get the vector and the element to be deleted
Initialize a reverse iterator on the vector
Erase the required element with the help of base() and erase()Reason for using base(): erase() returns a valid iterator to the new location of the element which follows the one, which was just erased, in a forward sense. So we can’t use the same process while using reverse iterators where we want to go in the reverse direction instead of forward. And also we can’t pass a reverse iterator as a parameter to erase() function or it will give a compilation error.A reverse_iterator is just an iterator adaptor that reverses the direction of a given iterator. All operations on the reverse_iterator really occur on that underlying iterator. We can obtain that iterator using the reverse_iterator::base() function. Infact the relationship between itr.base() and itr is:&*(reverse_iterator(itr))==&*(itr-1)
Reason for using base(): erase() returns a valid iterator to the new location of the element which follows the one, which was just erased, in a forward sense. So we can’t use the same process while using reverse iterators where we want to go in the reverse direction instead of forward. And also we can’t pass a reverse iterator as a parameter to erase() function or it will give a compilation error.
A reverse_iterator is just an iterator adaptor that reverses the direction of a given iterator. All operations on the reverse_iterator really occur on that underlying iterator. We can obtain that iterator using the reverse_iterator::base() function. Infact the relationship between itr.base() and itr is:
&*(reverse_iterator(itr))==&*(itr-1)
Below is the implementation of the above approach:
// C++ program to delete an element of a vector// using erase() and reverse iterator.  #include <iostream>#include <vector>  using namespace std;  // Function to delete element// 'num' from vector 'vec'vector<int> delete_ele(vector<int> vec, int num){    // initializing a reverse iterator    vector<int>::reverse_iterator itr1;      for (itr1 = vec.rbegin(); itr1 < vec.rend(); itr1++) {          if (*itr1 == num) {              // erasing element = 16            vec.erase((itr1 + 1).base());        }    }      return vec;}  // Driver codeint main(){    vector<int> vec = { 1, 4, 7, 10, 13, 16, 19 };      // we want to delete element = 16    int num = 16;      vector<int>::iterator itr1;      cout << "Vector originally: \n";    for (itr1 = vec.begin(); itr1 < vec.end(); itr1++) {          // printing the original elements of vector        cout << *itr1 << " ";    }      cout << "\n\nElement to be deleted: "         << num << "\n\n";      // reinitializing vector 'vec'    // after deleting 'num'    // from the vector    // and keeping other remaining    // elements as they are    vec = delete_ele(vec, num);      vector<int>::iterator itr2;      cout << "Vector after deletion: \n";    for (itr2 = vec.begin(); itr2 < vec.end(); itr2++) {          // printing the remaining elements of vector        cout << *itr2 << " ";    }      return 0;}// This code is contributed by supratik_mitra
Vector originally: 
1 4 7 10 13 16 19 

Element to be deleted: 16

Vector after deletion: 
1 4 7 10 13 19

cpp-vector
C++
C++ Programs
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Operator Overloading in C++
Polymorphism in C++
Sorting a vector in C++
Friend class and function in C++
Iterators in C++ STL
Header files in C/C++ and its uses
How to return multiple values from a function in C or C++?
C++ Program for QuickSort
Program to print ASCII Value of a character
Sorting a Map by value in C++ STL