Iterate through a list c++ – Different Ways to Iterate over a List of Objects in C++

Iterate through a list c++: In the previous article, we have discussed about Difference between Vector and List in C++. Let us learn how to Iterate over a List of Objects in C++ Program.

4 Different ways to Iterate Over a List of Objects

C++ list iterator: In this article we will learn 4 different techniques for iterating through std::list of objects.

Suppose, we have a struct Student which contains roll and name.

struct Student
{
    int roll;
    std::string name;
    Student(int studRoll, std::string studName) :
            roll(studRoll), name(studName)
    {
    }
    bool operator <(const Student & studObj) const
    {
        return roll < studObj.roll;
    }
};

Lets create a list of Student objects,

std::list<Student> list_Students = { Student(15, "Aditya"),
                                    Student(6, "Sujeet"),
                                    Student(41, "Arhan"),
                                    Student(28, "Dipti"),
                                    Student(3, "Tamanna"),};

Now let’s try implementing different ways to iterate over list of Student.

Method 1- Iterate over list using Iterators :

C++ list iterator: It involves several steps.

  • First we will create a std::list iterator.
  • Initially iterator points to the first element.
  • Keep incrementing iterator till the last element of the list.
  • During each pass, access element through iterator

To create Iterator of std::list

std::list<Student>::iterator iter;

To make iterator point to beginning and iterate till the end of the list

for (iter = list_Student.begin(); iter != list_Student.end(); iter++)

{

    // Access the object elements

    int roll = iter->roll;

    std::string name = iter->name;


    //Print the contents available

    std::cout << roll << " :: " << name << std::endl;

}

Let’s see the below program to understand it clearly.

#include <list>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

struct Student
{
    int roll;
    std::string name;
    Student(int studRoll, std::string studName) :
            roll(studRoll), name(studName)
    {
    }
    bool operator <(const Student & studObj) const
    {
        return roll < studObj.roll;
    }
};

int main(){
    std::list<Student> list_Students = { Student(15, "Aditya"),
                                    Student(6, "Sujeet"),
                                    Student(41, "Arhan"),
                                    Student(28, "Dipti"),
                                    Student(3, "Tamanna"),};
                                    
                                    
   std::cout<<"List of Student  : "<<std::endl;    
   //Iterator of std::list
    std::list<Student>::iterator iter;
    // Make iterator point to beginning and iterate till the end of the list
    for (iter = list_Students.begin(); iter != list_Students.end(); iter++)
{
    // Access the object elements
    int roll = iter->roll;
    std::string name = iter->name;
    
    //Print the contents available
    std::cout << roll << " :: " << name << std::endl;
}                                  
}
Output :

List of Student  :

15 :: Aditya

6 :: Sujeet

41 :: Arhan

28 :: Dipti

3 :: Tamanna

Method 2- Iterate over list using std::for_each and Lambda Function :

Similarly an STL algorithm i.e. std::for_each accepts a range and a function,

template <class InputIter, class Function>

Function for_each (InputIter begin, InputIterator last, Function func);

It iterates over the range and pass element to function func, and we will just have to pass begin() and end() of list as range arguments and lambda function as third argument e.g.

std::for_each(list_Students.begin(), list_Students.end(),

[](const Student & stud)

{

//Access and print the contents

std::cout<<stud.roll<< " :: "<<stud.name<<std::endl;

});

Let’s see the below program to understand it clearly.

#include <list>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

struct Student
{
    int roll;
    std::string name;
    Student(int studRoll, std::string studName) :
            roll(studRoll), name(studName)
    {
    }
    bool operator <(const Student & studObj) const
    {
        return roll < studObj.roll;
    }
};

int main(){
    std::list<Student> list_Students = { Student(15, "Aditya"),
                                    Student(6, "Sujeet"),
                                    Student(41, "Arhan"),
                                    Student(28, "Dipti"),
                                    Student(3, "Tamanna"),};
                                    
                                    
   std::cout<<"List of Student  : "<<std::endl;    
   std::for_each(list_Students.begin(), list_Students.end(),
        [](const Student & stud)
        {
            //Access and print the contents
            std::cout<<stud.roll<< " :: "<<stud.name<<std::endl;
        });

}
Output :

List of Student  :

15 :: Aditya

6 :: Sujeet

41 :: Arhan

28 :: Dipti

3 :: Tamanna

Method 3- Iterate over list in Reverse Order using reverse_iterator :

We can even print the list in reverse order.

  • list::rbegin() – It returns a revese_iterator which points to the end of std::list
  • list::rend() – It returns a revese_iterator which points to the beginning of std::list

Let’s see the below program to understand it clearly.

#include <list>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

struct Student
{
    int roll;
    std::string name;
    Student(int studRoll, std::string studName) :
            roll(studRoll), name(studName)
    {
    }
    bool operator <(const Student & studObj) const
    {
        return roll < studObj.roll;
    }
};

int main(){
    std::list<Student> list_Students = { Student(15, "Aditya"),
                                    Student(6, "Sujeet"),
                                    Student(41, "Arhan"),
                                    Student(28, "Dipti"),
                                    Student(3, "Tamanna"),};
                                    
                                    
   std::cout<<"List of Student  : "<<std::endl;    
for (const Student & stud : list_Students)
{
    std::cout << stud.roll << " :: " << stud.name << std::endl;
}

   std::cout<<"\nList of Student in reverse order  : "<<std::endl;    


  // reverse iterator for std::list
    std::list<Student>::reverse_iterator revIter;
    // MAke iterator point to beginnig and increment till it reahes end of the list
    for (revIter = list_Students.rbegin(); revIter != list_Students.rend(); revIter++)
    {
        // Access the Student objects through iterator
        int roll = revIter->roll;
        std::string name = revIter->name;
        //Print the contents in reverse order
        std::cout << roll << " :: " << name << std::endl;
    }

}
Output :

List of Student  :

15 :: Aditya

6 :: Sujeet

41 :: Arhan

28 :: Dipti

3 :: Tamanna



List of Student in reverse order  :

3 :: Tamanna

28 :: Dipti

41 :: Arhan

6 :: Sujeet

15 :: Aditya

Method 4- Iterate over list using c++11 Range Based For Loop :

We can also iterate over a list taking a for loop.

Let’s see the below program to understand it clearly.

#include <list>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

struct Student
{
    int roll;
    std::string name;
    Student(int studRoll, std::string studName) :
            roll(studRoll), name(studName)
    {
    }
    bool operator <(const Student & studObj) const
    {
        return roll < studObj.roll;
    }
};

int main(){
    std::list<Student> list_Students = { Student(15, "Aditya"),
                                    Student(6, "Sujeet"),
                                    Student(41, "Arhan"),
                                    Student(28, "Dipti"),
                                    Student(3, "Tamanna"),};
                                    
                                    
   std::cout<<"List of Student  : "<<std::endl;    
for (const Student & stud : list_Students)
{
    std::cout << stud.roll << " :: " << stud.name << std::endl;
}

}
Output :

List of Student  :

15 :: Aditya

6 :: Sujeet

41 :: Arhan

28 :: Dipti

3 :: Tamanna