Decrementing an iterator in C++
In this tutorial, we are going to learn how to decrement an iterator in C++. These are used to traverse through the elements of the containers.
All containers in C++ do not support all iterators. We can only decrement random access iterators and bidirectional iterators. But we cannot decrement forward iterators, input iterators, and output iterators.
Decrementing a random access iterator:
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> ::iterator itr;
//itr is random access iterator
vector<int> a={1,2,3,4};
itr=a.begin();
//Itertor points to first element
itr++;
//Iterator points to the second element
itr--;
/* Iterator points to the first element
after decrementing */
cout<<*itr<<endl;
itr = itr + 1;
// Iterator points to the second element
itr = itr - 1;
/*Iterator points to the first element
after decrementing it using arithmetic operation*/
cout<<*itr<<endl;
}Output:
1 1
In the above code, we used a vector. So if we declare an iterator for a vector it will be a random access iterator.
The random access iterator can be decremented either by using the decrement operator(- -) or by using arithmetic operation.
If itr is an iterator. We can use itr – – or – – itr for decrementing it. As it is a random access iterator we can also use arithmetic operation such as itr=itr-1 for decrementing it.
Decrementing a bidirectional iterator:
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int> ::iterator itr;
//itr is bidirectional iterator
set<int> a={1,2,3,4};
itr=a.begin();
//Itertor points to first element
itr++;
//Iterator points to the second element
itr--;
/* Iterator points to the first element
after decrementing */
cout<<*itr<<endl;
}Output:
1
If we declare an iterator for a set it will be a bidirectional iterator.
We can decrement a bidirectional only by using the decrement operator(- -). We cannot decrement it using arithmetic operations.
If itr is an iterator. We can use itr – – or – – itr for decrementing it. We cannot use itr=itr -1 for decrementing the iterator.
Decrementing an iterator using a built-in function:
We can use the advance() function for decrementing an iterator.
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> ::iterator itr;
vector<int> a={1,2,3,4};
itr=a.begin();
//Itertor points to first element
itr++;
//Iterator points to the second element
advance(itr,-1);
/* Iterator points to the first element
after decrementing */
cout<<*itr<<endl;
}Output:
1
Traversing a container in reverse order in C++:
If a container supports a random access iterator or a bidirectional iterator then we can traverse it in a reverse order using an iterator.
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> ::iterator itr;
vector<int> a={1,2,3,4};
itr = a.end()-1;
//Iterator points to the last element
while(true){
cout<<*itr<<' ';
/* If the iterator reaches the first
element we can break the loop */
if(itr == a.begin()){
break;
}
itr--;
}
cout<<endl;
}Output:
4 3 2 1
We hope that you have got a clear idea of how to decrement an iterator in C++.
Also read: How to check if two given sets are disjoint in C++
Leave a Reply