C++ Tutorial Index

C++ Tutorial C++ History C++ Installation C++ First Program C++ cin and cout C++ Data type C++ Variable C++ operator C++ Keywords

C++ Control Statements

C++ If C++ Nested if C++ If-else C++ If-else-if C++ Switch C++ Break C++ Continue C++ Goto C++ For loop C++ While loop C++ Do while loop

C++ Functions

C++ Call by Value C++ Call by Reference C++ Recursion Function C++ Inline function C++ Friend function

C++ Arrays

Single dimension array Two dimension array

C++ Strings

C++ Strings

C++ Inheritance

C++ Inheritance Single level Inheritance Multilevel Inheritance Multiple Inheritance Hierarchical Inheritance Hybrid Inheritance

C++ Polymorphism

C++ Polymorphism C++ Overloading C++ Overriding C++ Virtual Function

C++ Pointers

C++ Pointers C++ this pointer

C++ Exception Handling

C++ Exception Handling

C++ Constructors

C++ Constructors Default Constructor Parameterize Constructor Copy constructor Constructor Overloading Destructor

C++ File Handling

C++ File Handling C++ Writing to file C++ Reading file C++ Close file

Miscellaneous

C Vs C++ C++ Comments C++ Data Abstraction C++ Identifier C++ Memory Management C++ Storage Classes C++ Void Pointer C++ Array To Function C++ Expressions C++ Features C++ Interfaces C++ Encapsulation std::min in C++ External merge sort in C++ Remove duplicates from sorted array in C++ Precision of floating point numbers Using these functions floor(), ceil(), trunc(), round() and setprecision() in C++ C++ References C++ Friend Functions C++ Mutable keyword Unary Operators in C++ Initialize Array of objects with parameterized constructors in C++ Differences between #define & const in C/C++ C++ Program to Implement Shell Sort C++ Program to Implement Merge Sort Storage Classes in C Vector resize() in C++ Passing by Reference Vs. Passing by the pointer in C++ Free vs delete() in C++ goto statement in C and C++ C++ program to read string using cin.getline() C++ String Concatenation Heap Sort in C++ Swap numbers in C++ Input Iterators in C++ Fibonacci Series in C++ C ++ Program: Alphabet Triangle and Number Triangle C++ Program: Matrix Multiplication C++ Program to Print Fibonacci Triangle Stack in C++ Maps in C++ Queue in C++ C++ Bitset C++ Algorithms Priority Queue in C++ C++ Multimap C++ Deque Function Pointer in C++ Sizeof() Operators in C++ C++ array of Pointers free() Vs delete in C Timsort Implementation Using C++ CPP Templates C++ Aggregation C++ Enumeration C++ Math Functions C++ Object Class C++ Queue Initialize Vector in C++ Vector in C++ C++ STL Components Function overloading in C++ C++ Maximum Index Problem C++ find missing in the second array C++ Program to find the product array puzzle C++ Program To Find Largest Subarray With 0 Sum C++ Program To Move All Zeros To The End Of The Array C++ Program to find the element that occurs once C++ Program to find the largest number formed from an array Constructor Vs Destructor C++ Namespaces C++ OOPs Concept C++ Static C++ Structs C++ Try-Catch C++ User Defined Exceptions C++ Virtual Destructor C++ vs C# Malloc() and new in C++ Palindrome Number Program in C++ Snake Code in C++ Splitting a string in C++ Structure Vs Class in C++ Virtual Function Vs Pure Virtual Function C++ Bidirectional Iterators C++ Forward Iterators C++ Iterators C++ Output Iterators C++ Range-based For Loop Converting string into integer in C++ LCM Program in C++ Type conversion in C++ Add two numbers using the function in C++ Advantage and disadvantage friend function C++ Armstrong Number Program in C++ ATM machine program in C++ using functions Binary to Decimal in C++ Bit Manipulation in C++ C++ Constructor C++ Dijkstra Algorithm Using the Priority Queue C++ int into String C++ Signal Handling Decimal to Binary in C++ Decimal to Hexadecimal in C++ Decimal to Octal in C++ Factorial Program in C++ Function in C++ Hexadecimal to Decimal in C++ Octal to Decimal in C++ Reverse a Number in C++ Structure Vs Class in C++ C++ Forward Iterators C++ Output Iterators C++ Prime number program Char Array to String in C++ Constructor Overloading in C++ Default arguments in C++ Different Ways to Compare Strings in C++ Dynamic Binding in C++ Program to convert infix to postfix expression in C++ SET Data Structure in C++ Upcasting and Downcasting in C++ Reverse an Array in C++ Fast Input and Output in C++ Delete Operator in C++ Copy elision in C++ C++ Date and Time C++ Bitwise XOR Operator Array of sets in C++ Binary Operator Overloading in C++ Binary Search in C++ Implementing the sets without C++ STL containers Scope Resolution Operator in C++ Smart pointers in C++ Types of polymorphism in C++ Exception Handling in C++ vs Java Const Keyword in C++ Type Casting in C++ Static keyword in C++ vs Java Inheritance in C++ vs Java How to concatenate two strings in C++ Programs to Print Pyramid Patterns in C++ swap() function in C++ Structure of C++ Program Stringstream in C++ and its applications rand() and srand() in C / C++ C++ Ternary Operator C++ Scope of Variables While Loop Examples in C++ Star pattern in C++ using For Loops For Loop Examples in C++ Do-While Loop Examples in C++ Top 5 IDEs for C++ That You Should Try Once Assertions in C/C++ C++ Convert Int to String Continue in C++ While loop Diamond Pattern in C++ using For Loop How to Reverse a String in C++ using Do-While Loop How to Reverse a String in C++ using For Loop How to Reverse a String in C++ using While Loop Infinite loop in C++ Loops in C++ Returning Multiple Values from a Function using Tuple and Pair in C++ wcscpy(), wcslen(), wcscmp() Functions in C++ Auto keyword in C++ C++ 11 vs C++ 14 vs C++ 17 C++ STL (Standard Template Library) Differences Between C Structures and C++ Structures Divide by Zero Exception in C++ Dynamic Constructor in C++ Dynamic Memory Allocation in C++ Find the Size of Array in C/C++ without using sizeof() function Floating Point Operations and Associativity in C, C++ and Java Hello World Program in C++ How to create a table in C++ How to Setup Environment for C++ Programming on Mac Implementation of a Falling Matrix in C++ Message Passing in C++ Pointer to Object in C++ Templates in C++ vs Generics in Java Ways to Copy a Vector in C++ What does Buffer Flush mean in C++ sort() function in C++ Structure Sorting (By Multiple Rules) in C++ Similarities between C++ and Java std::distance in C++ Array program in C++ C++ Tricks for Competitive Programming Desired Capabilities in Selenium Web Driver in C++ Socket Programming in C++ Template Specialization in C++ Classes and Objects in C++ Convex hull Algorithm in C++ DES in C++ C++ vardiac() function Difference between Two Sets in C++ Difference between Exit and Return Structured Binding in C++ Differences between Local and Global Variable Bitwise Operator vs Logical Operator Difference between OOP and POP in C++ Fork in C++ Functors in C++ How to call a void function in C++ How to create a directory or folder in C/C++ How to create a library in C++ How to create a stack in C++ How to create the Processes with Fork in C++ How to Handle Divide by Zero Exception in C++ Lambda Expression in C++ Pattern programs in C++ Roadmap to C++ Programming Substring in C++ Virtual base class in C++ Bits stdc++.h in C++ Top 14 Best Free C++ IDE (Editor & Compiler) for Windows in 2022 Bitmasking in C++ Auto Keyword in C++ Features of OOPS in C++ Hospital Management Project in C++ How to Declare Unordered Sets in C++ How to Sort an Array in C++ Include Guards in C++ Iostream in C++ Method overriding in C++ How to run program in turbo c++ How to Use Getline in C++ Leap Year Program in C++ Naming Convention in C++ New Operator in C++ Nullptr in C++ Object Slicing in C++ Principles of Object-Oriented Programming in C++ Processing strings using std string stream in C++ Pure Virtual Function in C++ With Example Program Random Number Generator in C++ Singleton Design Pattern in C++ Size_t Data Type in C++ Skyline Problem in C++ System() function in C++ Web Development in C++ Data Hiding in C++ Difference between exit() and _Exit() in C++ Hashing in C++ Object in C++ Sum of all Elements between k1’th and k2’th Smallest Elements Virtual class in C++ Vector Size in C++ Top best IDEs for C/C++ Developers in 2022 Tensorflow in C++ Sliding Window Technique in C++ Reverse String Word-Wise in C++ Returning a Function Pointer from a Function in C/C++ RTTI in C++ Pthreads or POSIX Threads in C++ Reserved Keywords in C++ Passing a Vector to a function in C++ 10 Best C and C++ Books for Beginners & Advanced Programmers Add two numbers represented by two arrays in C++ Array of Object in C++ C++ Program For FCFS Containership in C++ Counting Frequencies of Array Elements in C++ Decltype type Specifier in C++ Dynamic _Cast in C++ Difference between int main() and int main(void) in C/C++ Depth First Search Program to Traverse a Graph in C++ Features and Use Of Pointers in C/C++ Fread Function in C++ Programming Fscanf Function in The C++ Functions in C++ With Types and Examples Gmtime Function in C/C++ How is Multiset Implemented in C++ How to Build a Program in C++ How to Declare a 2d Array Dynamically in C++ inheritance Program in C++ int Max and int Min in C/C++ is It Fine to Write Void Main Or Main in C/C++ How to create a button in C++ abs() function in C++ Compile Time Polymorphism in C++ Division in C++ Factorial of a Number in C++ using while Loop Multiset in C++ 4 Pillars of OOPs Approach in C++ Backtracking Time Complexity in C++ C++ Global Variable C++ Pipe Tutorial Observer Design Pattern in C++ Private Inheritance in C++ Pthread in C++ Parameters SDL library in C++ with Examples Pointers in C++ Abstract Factory Design Pattern in C++ Ascending order in C++ How the value is passed in C++ Call by Pointer in C++ Constexpr in C++ Deadlock in C++ Design Patterns in C++ Factory Method for Designing Pattern in C++ How to calculate size of string in C++ Name Mangling and extern in C++ Preventing Object Copy in C++ Program that produces different results in C and C++ Quick Sort in C++ Single Handling in C++ Type difference of Character literals in C VS C++ Use of Inheritance in C++ User-defined literals in C++ Vector methods in C++ Void * in C and C++ Zombie and Orphan Process in C++ Isprint() in C++ List and Vector in C++ List iterators in C++ Merging Two Vectors in C++ Sleep function in C++ Stoi function in C++ String erase() in C++ String Trim in C++ When should we write own Assignment operator in C++ C++ tcp client server example C++ tcp server example Early Binding and Late Binding in C++ Factory Design Pattern in C++ Fisher-Yates shuffle algorithm in C++ For Auto in C++ Group anagrams in C++ How to convert binary string to int in C++ How to convert string to float in C++ How to remove space from string in C++ How to use pair in C++ How to use the string find() in C++ Dynamic Casting in C++ 2D Vector Initialization in C++ C++ GUI Visual Studio C++ IPC C++ Macro Function Example C++ Permutation Overloading Stream Insertion in C++ Overloading array Index operator in C++ Operators that cannot be overloaded in C++ Operator overloading in C++ isprint() function in c++ Is_trivial function in C++ Is assignment operator Inherited in C++ div() function in C++ Default Assignment Operator and References in C++ Copy Constructor vs Assignment Operator in C++ Conversion Operator in C++ Array sum in C++ STL C++ Define Macro C++ Design C++ Factory Pattern TCP Client Server Example in C++ Convert String to Uppercase in C++ exit() and _Exit() in C and C++ Initializer list in C++ Iterator invalidation in C++ Lower bound in C++ Modulus of Two float numbers or double number Pass by value in C++ Set insert function in C++ Std partition_point in C++ Unary Operator Overloading in C++ Using Default Arguments with Virtual Functions Virtual Functions and Runtime Polymorphism What is endl in C++ What is Unary Operator Overloading in C++ Which operators cannot be overloaded in C++ C++ Program to Divide the String Into N equal Parts Gray Code to Binary Code in C++ How to get the value of pi in C++ Multimap value_comp() function in C++ Vector of Vectors in C++ Naïve Bayes Algorithm in C++ Minimum Cost Path Problem in C++ 10 C++ Programming Tricks You Should Know btowc() function in C++ forward_list::cend() in C++ Unordered_multimap max_load_factor() function in C++ Cpp_int in c++ Dynamic Objects in C++ FLOCK() FUNCTION IN C++ Generate Random Double Numbers in C++ How to Assign Infinity to a Number in C++ Jump statements in C++ Multipath inheritance in C++ Out of Range Exception in C++ Size of Class in C++ Size of string in C++ std::binary_negate in c++ Thread_local in C++ Tokenizing a String in C++ Ancestors of a Node in Binary Search Tree C++ program for Double to String Conversion C++ Program to Demonstrate Use of Formatting Flags on Float Output Clamp in C++ K-Dimensional Tree in C++ Mutable Lambda in C++ Power Set in C++ Program to Find Sum of Geometric Progression Std::Back_inserter in C++ Strpbrk() function in C++ Size of int in C++ TYPES OF MANIPULATORS IN C++ Double colon in C++ How to sort vector in C++ How to use Setprecision in C++ How to write a Vector in C++ Insertion in Splay Tree in C++ Merge Sort Algorithm in C++ Printing a Character using ASCII value in C++ Regex in C++ Size of Data Types in C++ Abstract Factory Design Pattern in C++ Sqrtf() function in C++ Static Casting in C++ Using Range in Switch Case in C++ wcstoimax() and wcstoumax() function in C++ What is float in C++ What is the Diamond Problem in C++ Best way to learn C++ ios setstate() function in C++ Nested Namespace in C++ Single Inheritance in C++

C++ Iterators

What are iterators ?

Iterators are among the four foundations of the C++ Standard Template Library, also known as the STL. The memory address of the STL container classes is pointed to using an iterator. To some extent, you can link them along a pointer for better comprehension.

Iterators serve as a link between algorithms and STL containers, allowing the data inside the container to be modified. They let you to iterate through the container, access and assign values, and apply various operators to them in order to get the required outcome.

Unlike pointers, iterators are separated into categories, and each one may be utilized in any algorithm which fits into that category. Iterators give access such that containers would not need to know about algorithms, and algorithms need not know about containers. The ideal world model that the human mind desires is one where nobody knows anything and everything occurs just as it should.

Important briefing :

  • Iterators are used to go from one element to the next, which is referred as iterating through the container.
  • An iterator's key benefit is that it defines a shared interface for all container types.
  • Iterators allow the method to be independent of the container type.
  • Iterators give a common way to browse across a container's components.

Uses of Iterators in C++ :

In C++, an iterator is used for the following purposes :

  • An iterator's primary goal is to get access to the STL container elements and conduct actions on them.
  • Because the iterators enable shared usage for all of them, the underlying structure of a container is irrelevant.
  • The container type has no bearing on iterator algorithms.
  • It is possible to loop over container elements using an iterator. It can also provide such elements access to change their values.
  • For STL container classes, iterators use a generic approach. This eliminates the need for programmers to learn about various iterators for various containers.

Syntax :

<ContainersType> :: iterator;  
<ContainersType> :: consts_iterator;  

Here, ContainersType specifies the kind of container for whom the iterator is defined.

The Iterators were subjected to the following operations :

  • The '*' operator gives the member of the iterator's current position.
  • The iterator is incremented by one with the ++ operator. As a result, an iterator leads to the container's next element.
  • : Both the operator (==) and the operator (!=) evaluate if the 2 iterators refer to the same spot or not.
  • The iterator is assigned using the '=' operator.

Iterators vs. Pointers : What's the Difference ?

Even though the pointers and iterators appear to be the same at first look, there are many key distinctions to be aware of.

Pointers :

Pointers are variables that store the memory address of the variable to which they point. A pointer, like any other variable, has a data type that matches the type of variable whose memory it is holding. The pointer assists in sending huge amounts of data to functions by simply supplying the object's memory location.

Syntax for declaring a pointer  :

datatype* pointers_name

Example :

#include <iostream> 
using namespace std;
int main() 
{
    // initializing the variable myVrbl
    int myVrbl = 100;      
    // initializing the pointer pntr
    // pointing to the variable myVrbl             
    int* pntr = &myVrbl;  
    // printing the variable myVrbl will show 100
    cout << "Value that is stored in myVrbl: " << myVrbl;
    cout << "\n"; 
    // printing the *pntr will also show 100
    cout << "Dereferenced pointer that points to myVrbl : " << *pntr;
    cout << "\n";
    // updating the value of the variable myVrbl
    myVrbl++;  
    // now the *pntr will print 101, since variablr myVrbl has been updated
    cout << "Dereferenced pointer that points to myVrbl after updating myVrbl  : ";
    cout << *pntr;
    cout << "\n\n";
    return 0; 
} 

Output :

Value that is stored in myVrbl : 100
Dereferenced pointer that points to myVrbl : 100
Dereferenced pointer that points to myVrbl after updating myVrbl : 101

Explanation :

In the above example, we showed the use of pointers in C++. We first initialized the variable myVrbl and allotted a value to it. Then the pointer pntr was initialized and that was set to point towards the variable myVrbl. We then printed the variable myVrbl and then pointer pntr and both showed the exact same output. Then we incremented the value of the pntr only and printed it and got the incremented value as expected.

Iterators :

Iterators are often utilized to refer to the STL containers' memory locations. In addition, an iterator is utilized to loop across the data structures. It can access and assign values in ways that a pointer cannot.

In C++, pointers could also point to functions, but iterators are only used to execute actions on STL containers.

Syntax for declaring a iterator :

type_container :: iterator itrtr_name

Example :

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    // initializing the vector vect1
    vector<int> vect1 = { 100, 200, 300, 400 }; 
    // declarint the iterator itrtr
    vector<int>::iterator itrtr;
    // accessing the vector elements without the iterator
    cout << "Traversing without the iterator : ";
    for (int x = 0; x < 4; ++x) {
        cout << vect1[x] << " ";
    }
    cout << "\n";
    // accessing the vector elements using the iterator
    cout << "Traversing using the iterator : ";
    for (itrtr = vect1.begin(); itrtr != vect1.end(); ++itrtr) {
        cout << *itrtr << " ";
    }
    cout << "\n\n";
    // inserting an element into vect1 vector
    vect1.push_back(500);
    // accessing the vector elements without the iterator
    cout << "Traversing without the iterator : ";
    for (int x = 0; x < 5; ++x) {
        cout << vect1[x] << " ";
    }
    cout << "\n";
    // accessing the vector elements using the iterator
    cout << "Traversing using the iterator ";
    for (itrtr = vect1.begin(); itrtr != vect1.end(); ++itrtr) {
        cout << *itrtr << " ";
    }
    cout << "\n\n";
    return 0;
}

Output :

Traversing without the iterator : 100 200 300 400
Traversing using the iterator : 100 200 300 400
Traversing without the iterator : 100 200 300 400 500
Traversing using the iterator : 100 200 300 400 500

Explanation :

In the above example, we showed the use of iterators in C++. We first initialized a vector called vect1 with values given. Then we initialized an iterator called itrtr. We first accessed the vector elements without the iterator and printed the result it gave using a for loop. Then we accessed the vector elements using the iterator and with the help of for loop we printed the required output. Then we repeated the process by adding one more vector element and accessed all the elements again with and without iterator and printed them using the for loop to get the desired output.

Various Categories of the iterators :

As previously stated, there are five different categories of iterators in the C++ STL. Here, we will go through each of the five iterators in short. They constitute a class hierarchy, with each category inheriting the permitted operations from the one before it. Like the bi-directional iterators, which may travel forward and backward gradually over the variety of elements in the container to which they have been tied.

C++ Iterators

Fig. Types of Iterators

The following are the five categories of iterators :

1. Input iterators :

Among the five primary iterators in C++, the input iterator is the easiest and least utilized. This iterator is used consecutively for input operations. To put it another way, it is utilized to retrieve the values from container. It's a one-directional iterator. You are only permitted to increase the iterator after reading a value. You can’t decrease the input iterator in just about any way.

For an input iterator, the following operators are used:

2. Output iterators :

The output iterators do the exact opposite of the input iterators. For output operations, this iterator is utilized consecutively. In other words, it is employed in the assignment of values. However, it is unable to access the values. It is a companion to the input iterators, which allow you to access but not assign values. It is a one-directional iterator, just as the input iterator. You can only increase the iterator once you've assigned a value, and you can't decrease the output iterator in any manner.

The following operators are used in an output iterator :

3. Forward iterators :

Both of the input and output iterators are served by forward iterators. As a result, these iterators are called input-output operators. The values may be accessed (input iterator’s functionality) as well as assigned (functionality of output iterators). In one-way iterators, as their name implies, only forward movement is allowed. Additionally, Bidirectional and Random access iterators are valid forward iterators.

Forward iterators employ the following operators:

4. Bidirectional Iterators :

Iterators that are bidirectional and can iterate in any of the two directions. They are referred to as forward iterators with two increment operators because they perform the same functions as forward iterators but may travel in both directions. Bidirectional iterators are supported by containers like list, set, and multimap. Iterators with random access are also valid bidirectional iterators.

A bidirectional iterator uses the following operators:

5. Random Access Iterators :

The most powerful iterators are random-access iterators. They are not constrained to moving in a sequential manner; as their name implies, they can access any element within the container at any time. They're the ones with the same functionality as pointers. Random access iterators may be used to implement any relational operator. We may use relational operators on Random Access iterators instead of bidirectional operators.

STL Containers and iterators :

All five types of iterators are not supported by all STL containers. For example, the container "vector" supports random-access iterators, but the container "list" supports bidirectional iterators.

STL containers and the iterators that they support in C++ are listed in the table below:

C++ Iterators

Fig. Containers and Iterators Supported

Functions of Iterators :

1. begin():

The begin() method returns a reference to the container's initial element. This pointer is bidirectional since it can point in any direction of the container.

Syntax :

begin()

2. end() :

The end() function returns a reference to the element which appears after the container's last element. This element is a virtual element which holds the address of the previous element.

Syntax :

end()

Example :

#include <iostream>  
#include<iterator>  
#include<vector>  
using namespace std;  
int main()  
{  
   std::vector<int> vect{10,20,30,40,50};  
   vector<int>::iterator itrtr;  
   for(itrtr=vect.begin();itrtr!=vect.end();itrtr++)  
   {  
       std::cout << *itrtr <<" ";  
   }  
    return 0;  
}  

Output : 

10 20 30 40 50

Explanation :

In the above example, we first defined a vector called vect with five elements. Then we used the begin() method to return a reference to the container's initial element. We used the end() function to return a reference to the element which appears after the container's last element. We applied them using a for loop and printed all the vector vect elements as the required output.

3. advance() :

The advance() function moves the iterator forward from its current location. It accepts an integer as a parameter. The advance() function advances the pointer to the specified integer position.

Syntax :

advance(iterator itrtr ,int dist)iterator itrtr ,int dist)

Example :

#include<iostream> 
#include<iterator>  
#include<vector>  
using namespace std; 
int main() 
{ 
    // initializing the vector myVctr
    vector<int> myVctr = { 10, 20, 30, 40, 50 }; 
    // declaring the iterator itrtr
    vector<int>::iterator itrtr;
    // initializing iterator
    itrtr = myVctr.begin(); 
    // printing the original value onto 
    // which the iterator itrtr is pointing
    cout << "The iterator is originally pointing towards : ";
    cout << *itrtr << " ";
    cout << "\n\n";
    // updating the iterator by increasing it
    // by a dist of 3 using the advance() function of iterator
    advance(itrtr,3);     // iterator will now point towards 40
    // printing the current value to which iterator is pointing currently 
    cout << "The iterator is now pointing towards : "; 
    cout << *itrtr << " "; 
    cout << "\n\n";
    return 0;       
} 

Output :

The iterator is originally pointing towards : 10
The iterator is now pointing towards : 40

Explanation :

In the above example, we demonstrated the use of advance() function with the iterators in C++. We first initialized a vector called myVctr with five elements. Then we declared an iterator called itrtr and initialized it using the begin() function with the iterator. Then we printed the original value towards which the iterator was pointing to. The advance() function was then used to update the iterator and it was incremented by a distance of three to now point towards the third next element from the original value. The updated value, towards which the iterator itrtr was pointing to now, was printed as the required output.

4. next() :

The next() function returns an iterator pointing to the element obtained by increasing the iterator pointer first from current element.

Syntax :

next (iterator itrtr ,int x)

5. prev() :

The next() function is the polar opposite of the prev() method. It produces an iterator pointer that refers to the element obtained by subtracting the current element from the iterator.

Syntax :

previous(iterator itrtr, int x)

Example :

#include<iostream> 
#include<iterator>
#include<vector>
using namespace std; 
int main() 
{ 
    // initializing the vector myVctr
    vector<int> myVctr = { 10, 20, 30, 40, 50 }; 
    // declaring the iterators for the vector myVctr
    vector<int>::iterator itrtr1 = myVctr.begin(); 
    vector<int>::iterator itrtr2 = myVctr.end(); 
    // storing the pointer returned by the next() function
    // after increasing the itrtr1 by 3
    auto nextPntr = next(itrtr1, 3); 
    // storing the pointer returned by the prev() function
    // after decreasing the itrtr2 by 3
    auto prevPntr = prev(itrtr2, 3); 
    // Displaying the iterator’s position 
    // printing the value of new iterator that is returned by the next() function
    cout << "The new pointer after the use of next() now points towards : "; 
    cout << "\n";
    cout << *nextPntr << " "; 
    cout << "\n\n"; 
    // Displaying the iterator’s position 
    // printing the value of the new iterator that is returned by the prev() function
    cout << "The new pointer after the use of prev() now points towards : "; 
    cout << "\n";
    cout << *prevPntr << " "; 
    cout << "\n\n"; 
    return 0;  
}

Output :

The new pointer after the use of next() now points towards : 40
The new pointer after the use of prev() now points towards : 30

Explanation :

In the above example, we demonstrated the use of the next() and the prev() function in our code. We initialized a vector called myVctr with five elements. Then we declared the iterators itrtr1 and itrtr2 for the vector myVctr using the begin() and end() function respectively. In the pointer nextPntr, the pointer returned by the next() function after increasing the itrtr1 by distance three, was stored. In the pointer prevPntr, the pointer returned by the prev() function after decreasing the itrtr2 by distance three, was stored. Then we printed the value of new iterator which was returned by the next() function as well as the value of new iterator which was returned by the prev() function. Hence, the required output was printed.

Characteristics of the Iterators in C++ :

Iterators are capable of accessing, reading, writing, and iterating through container elements. Not all iterators, however, have all of the features. The iterators are shown in the table below, along with their attributes.

C++ Iterators

Fig. Characteristics of Iterators

Advantages of Iterators in C++ :

There are several examples that demonstrate how iterators are incredibly beneficial to everyone and motivate us to utilize them extensively. The following are some of the advantages of utilizing iterators:

1. Convenience in programming :

It is preferable to use iterators to loop through the contents of containers, because if we do not use an iterator and access elements using the [] operator, we must always be concerned about the container's size, whereas with iterators, we can easily utilize member function end() and make changes through the contents without having to remember anything.

Example :

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	// Declaring the vector vect
	vector<int> vect = { 10, 20, 30 };


	// Declaring the iterator itrtr
	vector<int>::iterator itrtr;


	int x;


	cout << "Without using the iterators = ";
	
	// Accessing elements without the utilization of iterators
	for (x = 0; x < 3; ++x)
	{
		cout << vect[x] << " ";
	}


	cout << "\nWith using the iterators = ";
	
	// Accessing the elements with the utilization of iterators
	for (y = vect.begin(); y != vect.end(); ++y)
	{
		cout << *y << " ";
	}


	// Addition of one more element to the vector vect
	vect.push_back(4);


	cout << "\nWithout using the iterators = ";
	
	// Accessing the elements without the use of the iterators
	for (x = 0; x < 4; ++x)
	{
		cout << vect[x] << " ";
	}


	cout << "\nWith using the iterators = ";
	
	// Accessing the elements with the utilization of iterators
	for (y = vect.begin(); y != vect.end(); ++y)
	{
		cout << *y << " ";
	}


	return 0;
}

Output :

Without using the iterators = 10 20 30
With using the iterators = 10 20 30
Without using the iterators = 10 20 30 40
With using the iterators = 10 20 30 40

Explanation :

As it can be seen in the code above, we were needed to maintain a list of the total elements inside the container without utilizing iterators. There have only been three elements at first, but once one more was added, the for loop had to be changed as well. However, because iterators were used, both the time and the for loop stayed the same. The iterators made our job easier and helped us to obtain the output we wanted.

2. Code Reusability :

Consider what would happen if we used a vect list instead of a vector in the preceding program, and instead of utilizing iterators to access the items, we just used the [] operator. This method of accessing would be useless for a list (since lists don't allow random-access iterators). If we had been utilizing iterators for vectors to retrieve the items, simply converting the vector to list in iterator declaration would have sufficed without doing anything further. Iterators improve reusability of programming by allowing access to elements of any container.

3. Container dynamic processing :

Iterators allow us to easily and dynamically, add and delete pieces first from container as needed.

Example :

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	// Declaring the vector vect
	vector<int> vect = { 10 , 20 , 30 };


	// Declaring the iterator itrtr
	vector<int>::iterator itrtr;


	int x;


	// Inserting the element using the iterators
	for (y = vect.begin(); y != vect.end(); ++y) {
		if (y == vect.begin()) {
			y = vect.insert(itrtr, 50);
			// inserting 50 at the beginning of the vector vect
		}
	}
	
	// vect now contains these elements - 50 10 20 30


	// Deleting an element by the use of iterators
	for (y = vect.begin(); y != vect.end(); ++y) {
		if (y == vect.begin() + 1) {
			y = vect.erase(y);
			// y will now points towards the element which is  after the element that is deleted
		}
	}
	
	// vector vect now contains - 50 20 30


	// Accessing the elements of vect using the iterators
	for (y = vect.begin(); y != vect.end(); ++y) {
		cout << *y << " ";
	}


	return 0;
}

Output :

50 20 30

Explanation :

As can be seen in the preceding code, we can simply and dynamically, add and remove items from the container utilizing iterators. However, doing so without them would have been extremely arduous because it would have required moving the elements each time prior to insertion and after deletion. Thus we used all the functions like erase(), insert(), begin() and end() to get the required output.

Drawbacks of Iterators in C++ :

We saw how useful iterators are in the last section. However, there are several disadvantages to utilizing iterators. Some of these drawbacks are listed below:

  • Iterators don't let you work with two data structures at the same time, especially when the first data structure's contents determine your position in the second.
  • Due to the way iterators operate, you can't go back when iterating through a container.
  • If you use an iterator to traverse the STL container, the structure cannot be modified while traversing it.

Random Access Iterator vs. Other Iterators :

A Random Access iterator is distinct from other iterators as it overcomes some of the constraints that other iterators have. The following are the major distinctions between the random access iterator and the other iterators:

  • Input Iterators vs. Random Access iterators :
    They are only accessible. They could only read data from the location where the pointer is pointing; they cannot assign values.
    On the other hand in Random Access iterators, the values can be assigned using these iterators.
  • Output Iterators vs. Random Access iterators :
    The values cannot be accessed via output iterators. These iterators are only for assigning values.
    On the other hand, Random Access iterator gives you access to the container's values.
  • Forward Iterators vs. Random Access iterators :
    These iterators are unidirectional. They can only move ahead, that is, they can only be increased. You can't take them away.
    On the other hand, the Random Access iterators work both ways. You may use these iterators to go ahead and backward.
  • Bidirectional Iterators vs. Random Access iterators :
    The bidirectional iterators don't recognize the offset dereference operator ([]). Dereferencing a bidirectional iterator with the offset operator is not possible.
    On the other hand, for dereferencing the variables, the Random Access iterators support using the offset dereferences operator.

Conclusion :

We learnt a lot regarding iterators in C++ in this article. This article discussed many types of iterators and also their applications. The merits and downsides of iterators were then thoroughly examined. We also looked at how much the iterator is useful in its own right.