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 Constructor Overloading in C++ Different Ways to Compare Strings 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++

Input Iterators in C++

What are input iterators?

Input iterators are used in sequence for carrying out input operations where each value is read-only. It is pointed by the iterator and further incremented.

All the iterators like forward, input, and bidirectional are also regarded as valid input iterators.

Input operators are not confined to only one type. There are multiple types. Let’s discuss this in detail.

Input iterators are the simplest and the weakest iterators. Such iterators are simple to use and valid for other functionalities that can be achieved by using them in our programs. They work on the phenomenon of iterating sequential inputs where each value is pointed by the iterator. Input iterators are read only once and later incremented.

To understand more clearly, consider these points that are easy to remember about input iterators:

  1. Input Iterators are used to read values from the container.
  • Values in containers can be accessed by using dereferencing in the input container.
  • It fails to change container values.
  • It is uni-directional (one-way).
  • It is incremental and cannot be decreased.
  • Operators for an input iterators include increment operator (++), decrement operator (--), dereference operator (*), not equal operator (!=) and equal operator (==).
  • An input Iterator is produced by the Istream.
  • A bidirectional iterator, forward iterator, and all others are input iterators.

Let us look at the operations and properties of input iterators.

       Properties   Expressions
Copy-assignable, copy-constructible and destructible  X b(a); b=a
  
Can be dereferenced      *x;
  
Can be compared with equality and inequality operator   a==b;  ,  a!=b
  
Can be incremented       ++i;
  

After considering the operations and properties, let us now closely examine the features of input iterators with the help of coding examples below.

Features of Input iterators

Let us look at a coding example to clearly visualize the working of input iterators. Let’s consider an example.

Example Code:

#include <iostream> 
 #include<vector> 
 #include<iterator> 
 using namespace std; 
 int main() 
 
     vector<int> vect{10,20,30,40,50}; 
     vector<int>::iterator itr1,itr2; 
     itr1=vect.begin(); 
     itr2=vect.begin()+1; 
     if(itr1==itr2)
       {
     std::cout << "Both the iterators are equal" << std::endl; 
     }
       if(itr1!=itr2)
       {    
     std::cout << "Both the iterators are not equal" << std::endl; 
     }
       return 0; 
 }   

1. Input iterators can only be used in those algorithms which allow single pass. A single-pass algorithm can go to all locations in a range when we may search any element in a container. It can iterate through all the locations at least once.

Input iterators are used to compare for equality with other iterators. We know that two iterators cannot point to a same position. But if they do, it clearly gives us a result that both the iterators are equal.
So, the following two expressions are valid if X and Y are input iterators: 

For Example:

X == Y  // Checking for equality
X != Y  // Checking for inequality

3. Input iterator can be used for dereferencing using * and -> operators for obtaining the value for storing the value that is being pointed by the iterator.

To visualize this, let us look at a coding example.

#include <iostream> 
#include<vector> 
  #include<iterator> 
  using namespace std; 
 int main() 
   {
    vector<int> vect{10,20,30,40}; 
    vector<int>::iterator itr; 
    itr = vect.begin(); 
    cout<<*itr; 
   return 0;
 }   

Output:

10

Explanation: Here, we can see that the vector is using begin() function. But it has not been assigned end() functional, since it is not an input iterator. The output 10 gives the idea that the *itr(dereferencing operator) points only the first element in the vector(dynamic array). So it prints only 10.

  • An input iterator is swappable provided two inputs pointing at different locations.

Let us discover it with a coding example

#include<iostream>
 #include<iterator> 
 using namespace std; 
 int main() 
 
     vector<int> vect{10,20,30,40}; 
     vector<int>::iterator itr,itr1,temp; 
     itr = vect.begin(); 
     itr1 = vect.begin()+1; 
     temp=itr; 
     itr=itr1; 
     itr1=temp; 
     cout<<*itr<<" "; 
     cout<<*itr1; 
     return 0; 
  

Output:

20 10

Limitations of input iterators

  1. Input iterators are restricted to only increment. Decrementing is not allowed while using input iterator. 

If X is used as an input iterator, then

X--   // Not allowed

2. Since it is unidirectional and is restricted to move only move forward, therefore, such iterators cannot be used in multi-pass algorithms, in which we need to process the container multiple times. 

3. Input iterators can be used with equality operators (==) but cannot be used as relational operators like <=.

x == y     // Allowed
x <= y     // Not Allowed

4. Input iterators resemble relational operators since they cannot be used with arithmetic operators like addition(+) and subtraction(-). This clearly implies that input iterators can move strictly forward and also they move one by one or sequentially.

If x and x are taken as input iterators, then

x+ 1     // Not allowed
y - 3     // Not allowed



ADVERTISEMENT
ADVERTISEMENT