In this article we will discuss different ways to iterate through std::list of objects.

Suppose we have a struct Player that contains id and name i.e.

struct Player
{
	int id;
	std::string name;

	Player(int playerId, std::string playerName) :
			id(playerId), name(playerName)
	{
	}
};

Lets create a list Player objects i.e.
std::list<Player> listofPlayers = { Player(22, "Sid"),
									Player(3, "Laura"),
									Player(43, "Riti"),
									Player(30,"Angel"),
									Player(2, "Laura")
									};

Now we will iterate through list of Player objects using different techniques i.e.

Iterating through list using Iterators

Steps:

  • Create an iterator of std::list.
  • Point to the first element
  • Keep on increment it, till it reaches the end of list.
  • During iteration access, the element through iterator

//Create an iterator of std::list
std::list<Player>::iterator it;

// Make iterate point to begining and incerement it one by one till it reaches the end of list.
for (it = listofPlayers.begin(); it != listofPlayers.end(); it++)
{
	// Access the object through iterator
	int id = it->id;
	std::string name = it->name;
	
	//Print the contents
	std::cout << id << " :: " << name << std::endl;

}

Iterating through list using std::for_each and Lambda Function

std::for_each is an STL algorithm that accepts a range and a function i.e.

template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);

It iterates over the given range and passes each element in range to the passed function fn.

We will pass begin() and end() of list as range arguments and lambda function as third argumen i.e.

std::for_each(listofPlayers.begin(), listofPlayers.end(),
		[](const Player & player)
		{
			//Print the contents
			std::cout<<player.id<< " :: "<<player.name<<std::endl;
		});

Iterating through list using c++11 Range Based For Loop

for (const Player & player : listofPlayers)
{
	std::cout << player.id << " :: " << player.name << std::endl;
}

Iterating through list in Reverse Order using reverse_iterator

  • list::rbegin() returns a reverse_iterator which points to the end of list
  • list::rend() returns a reverse_iterator which points to the beginning of list

reverse_iterator will iterate in backwards only.

	//Create a reverse iterator of std::list
	std::list<Player>::reverse_iterator revIt;

	// Make iterate point to begining and incerement it one by one till it reaches the end of list.
	for (revIt = listofPlayers.rbegin(); revIt != listofPlayers.rend(); revIt++)
	{
		// Access the object through iterator
		int id = revIt->id;
		std::string name = revIt->name;

		//Print the contents
		std::cout << id << " :: " << name << std::endl;

	}

Complete executable example is as follows,
#include <list>
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

struct Player
{
	int id;
	std::string name;

	Player(int playerId, std::string playerName) :
			id(playerId), name(playerName)
	{
	}
};

int main()
{
	std::list<Player> listofPlayers =
	{ Player(22, "Sid"), Player(3, "Laura"), Player(43, "Riti"), Player(30,
			"Angel"), Player(2, "Laura") };

	std::cout << "*******Iterate std::list using Iterators*******" << std::endl;

//Create an iterator of std::list
	std::list<Player>::iterator it;

// Make iterate point to begining and incerement it one by one till it reaches the end of list.
	for (it = listofPlayers.begin(); it != listofPlayers.end(); it++)
	{
		// Access the object through iterator
		int id = it->id;
		std::string name = it->name;

		//Print the contents
		std::cout << id << " :: " << name << std::endl;

	}

	std::cout
			<< "*******Iterate std::list using for_each and c++11's Lambda function *********"
			<< std::endl;

	std::for_each(listofPlayers.begin(), listofPlayers.end(),
			[](const Player & player)
			{
				//Print the contents
				std::cout<<player.id<< " :: "<<player.name<<std::endl;
			});

	std::cout
			<< "*******Iterate std::list using c++11 Range Based For Loop *********"
			<< std::endl;

	for (const Player & player : listofPlayers)
	{
		std::cout << player.id << " :: " << player.name << std::endl;
	}

	std::cout
			<< "*******Iterate std::list in backwords using Iterators *********"
			<< std::endl;

	//Create a reverse iterator of std::list
	std::list<Player>::reverse_iterator revIt;

	// Make iterate point to begining and incerement it one by one till it reaches the end of list.
	for (revIt = listofPlayers.rbegin(); revIt != listofPlayers.rend(); revIt++)
	{
		// Access the object through iterator
		int id = revIt->id;
		std::string name = revIt->name;

		//Print the contents
		std::cout << id << " :: " << name << std::endl;

	}

	return 0;

}

Output
22 :: Sid
3 :: Laura
43 :: Riti
30 :: Angel
2 :: Laura
*******Iterate std::list using for_each and c++11's Lambda function *********
22 :: Sid
3 :: Laura
43 :: Riti
30 :: Angel
2 :: Laura
*******Iterate std::list using c++11 Range Based For Loop *********
22 :: Sid
3 :: Laura
43 :: Riti
30 :: Angel
2 :: Laura
*******Iterate std::list in backwords using Iterators *********
2 :: Laura
30 :: Angel
43 :: Riti
3 :: Laura
22 :: Sid

To compile above code on linux use following command,

g++ –std=c++11 example.cpp

Join a list of 2000+ Programmers for latest Tips & Tutorials