C++ : How to copy / clone a STL List or Sub List

In this article we will discuss different techniques to clone the whole list or copy just a sub list.

Suppose we have a std::list of strings i.e.

// List of strings
std::list<std::string> listOfStrs = { "of", "is", "from", "this", "at", "to" };

Now let’s see how to copy this or a sub list from this list,

Copy a std::list using Copy constructor

std::list provides a copy constructor that clones a given to list to new list i.e.

list (const list& x);

We can use it to copy complete list while creating a new list i.e.
// copy all the contents of one list to another
std::list<std::string> listOfStrs_2(listOfStrs);

New list contents will be,
of , is , from , this , at , to ,

Copy a range or sub list to std::list using parameterized constructor

std::list provides a parameterized constructor that accepts a range and copies all the elements in given range to the new list.

list (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());

We can use it to copy complete list or any sub list while creating a new list i.e.
// copy all the contents of one list to another
std::list<std::string> listOfStrs_3(listOfStrs.begin(), listOfStrs.end());

New list contents will be,
of , is , from , this , at , to ,

Advertisements

 Copy a std::list using assignment operator

std::list provides an assignment operator that that copies all the contents of given list to the existing list i.e.

list& operator= (const list& x);

We can use it to copy complete list while creating a new list i.e.
// copy all the contents of one list to another
std::list<std::string> listOfStrsCopy = listOfStrs;

New list contents will be,
of , is , from , this , at , to ,

 Copy a std::list or sub list using list::assign()

std::list provides a member function assign(),

void assign (InputIterator first, InputIterator last);

It accepts a range and copies all the elements in given range to the existing list by replacing it contents.

We can use it to copy complete list to the existing list i.e.

// Create a new list of strings
std::list<std::string> listOfStrs_4;

/*
Copy all list contents using list'a assign member function
It accepts a iteratable range and copy all elements in that range to the list.
*/
listOfStrs_4.assign(listOfStrs.begin(), listOfStrs.end());

New list contents will be,
of , is , from , this , at , to ,

Copying a sub list using list::assign(),

Let’s Copy 2 elements from index 1 and 2 to the new list using std::list::assign()

std::list<std::string> listOfStrs_5;

// Copy 2 elements from index 1 and 2 to the new list
listOfStrs_5.assign(std::next(listOfStrs.begin(), 1), std::next(listOfStrs.begin() , 3));

New list contents will be,
is , from

 Copy a std::list or sub list using std::copy()

We can use STL algorithm to copy a range from a list i.e. a sub list or complete list to the another list i.e.

Let’s Copy 2 elements from index 1 and 2 to the new list using std::copy

std::list<std::string> listOfStrs_5;

// Copy 2 elements from index 1 and 2 to the new list
listOfStrs_5.assign(std::next(listOfStrs.begin(), 1), std::next(listOfStrs.begin() , 3));

New list contents will be,
is , from

 Copy a condition based sub list to std::list using std::copy_if() & Lambda Function

We can use STL algorithm to copy a only selective elements from a list to the another list i.e,

Copy string elements with size 2 from existing list to the new list using std::copy(),

std::list<std::string> listOfStrs_7;

// Copy string elements with size 2  to the new list using std::copy
std::copy_if(listOfStrs.begin(), listOfStrs.end(), std::back_inserter(listOfStrs_7), [](const std::string & str) {
																							if (str.size() == 2)
																								return true;
																							else
																								return false;
																					});

New list contents will be,
of , is , at , to ,

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

// Print the contents of a list
template <typename T>
void print(T  iteratableCont)
{
	for (auto elem : iteratableCont)
		std::cout << elem << " , ";
	std::cout << std::endl;
}


int main()
{
	// List of strings
	std::list<std::string> listOfStrs = { "of", "is", "from", "this", "at", "to" };

	// print the list
	print(listOfStrs);

	/* Copy a list using list's assignment operator */

	// copy all the contents of one list to another
	std::list<std::string> listOfStrs_2(listOfStrs);

	// print the list
	print(listOfStrs_2);

	/* Copy a list using list's copy constructor */

	// copy all the contents of one list to another
	std::list<std::string> listOfStrs_3(listOfStrs.begin(), listOfStrs.end());

	// print the list
	print(listOfStrs_3);

	// Create a new list of strings
	std::list<std::string> listOfStrs_4;
	
	/*
	Copy all list contents using list'a assign member function
	It accepts a iteratable range and copy all elements in that range to the list.
	*/
	listOfStrs_4.assign(listOfStrs.begin(), listOfStrs.end());

	// print the list
	print(listOfStrs_4);

	std::list<std::string> listOfStrs_5;
	
	/*
	Copy a sub list to another list using list's assign member function
	*/
	
	// Copy 2 elements from index 1 and 2 to the new list
	listOfStrs_5.assign(std::next(listOfStrs.begin(), 1), std::next(listOfStrs.begin() , 3));

	// print the list
	print(listOfStrs_5);

	/*
	Copy a sub list to another list using STL Algorithm std::copy
	*/

	std::list<std::string> listOfStrs_6;

	// Copy 2 elements from index 1 and 2 to the new list using std::copy
	std::copy(std::next(listOfStrs.begin(), 1), std::next(listOfStrs.begin(), 3), std::back_inserter(listOfStrs_6));

	// print the list
	print(listOfStrs_6);

	/*
	Copy a some elements from one list to another list based on some condition using STL Algorithm std::copy
	*/

	std::list<std::string> listOfStrs_7;
	
	// Copy string elements with size 2  to the new list using std::copy
	std::copy_if(listOfStrs.begin(), listOfStrs.end(), std::back_inserter(listOfStrs_7), [](const std::string & str) {
																								if (str.size() == 2)
																									return true;
																								else
																									return false;
																						});
	print(listOfStrs_7);

	return 0;

}

Output:
of , is , from , this , at , to , 
of , is , from , this , at , to , 
of , is , from , this , at , to , 
of , is , from , this , at , to , 
is , from , 
is , from , 
of , is , at , to , 

 

 

Do you want to Learn Modern C++ from best?

We have curated a list of Best C++ Courses, that will teach you the cutting edge Modern C++ from the absolute beginning to advanced level. It will also introduce to you the word of Smart Pointers, Move semantics, Rvalue, Lambda function, auto, Variadic template, range based for loops, Multi-threading and many other latest features of C++ i.e. from C++11 to C++20.

Check Detailed Reviews of Best Modern C++ Courses

Remember, C++ requires a lot of patience, persistence, and practice. So, start learning today.

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top