C++ sort lambda: In the previous article, we have discussed about Different ways to Initialize a list in C++. Let us learn how to Sort a List of Objects with Custom Comparator or Lambda Function in C++ Program.
Sorting a List of Objects with Custom Comparator or Lambda Function
Std sort lambda: In this article, we will learn different ways of sorting a std::list
of user defined data types with custom comparators and lambda function.
- Sorting a List with Default Criteria
- Sorting a List of Objects with Custom Comparator & Function Object
- Sorting a List of Objects with Custom Comparator & Lambda Function
Let we have a Student type that 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; } };
This student type has < operator
which compares two student using < on roll
field. Now, let’s create 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 sort list of Students using std::list::sort.
std::list::sort
Custom sort c++: It has two different overloaded versions i.e.
void std::list::sort(); // Will use default sorting criteria and will compare using < operator
template <class Compare> void sort (Compare comparator); //Accepts compare function or function object and using comparator it will sort
Sorting a List with Default Criteria :
Sort a list c++: We can sort a list with default criteria i.e. < operator of type which doesn’t accept any arguments. i.e. list_Students.sort();.
#include <iostream> #include <list> #include <string> #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<<"Students in the list before sorting were : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; // List being sorted by default criteria list_Students.sort(); std::cout<<"After sorting students based on roll : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; }
Output : Students in the list before sorting were : 15 :: Aditya 6 :: Sujeet 41 :: Arhan 28 :: Dipti 3 :: Tamanna After sorting students based on roll : 3 :: Tamanna 6 :: Sujeet 15 :: Aditya 28 :: Dipti 41 :: Arhan
Sorting a List of Objects with Custom Comparator & Function Object :
C++ custom sort: There is another overloaded version of std::list::sort
which accepts function pointer as an argument and compare while implementing sorting i.e.
template <class Compare> void sort (Compare studcomp);
Then we will define a function object or comparator which will compare student list based on their names.
struct StudentComp { // Compares 2 Students objects according to their names bool operator ()(const Student & stud1, const Student & stud2) { if(stud1.name == stud2.name) return stud1 < stud2; return stud1.name < stud2.name; } };
Now the above function will try to sort the list using the names by using list_Students.sort(StudentComp())
;
Complete program :
#include <iostream> #include <list> #include <string> #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; } }; struct StudentComp { // Compares 2 student objects based on their names bool operator ()(const Student & stud1, const Student & stud2) { if(stud1.name == stud2.name) return stud1 < stud2; return stud1.name < stud2.name; } }; int main(){ std::list<Student> list_Students = { Student(15, "Aditya"), Student(6, "Sujeet"), Student(41, "Arhan"), Student(28, "Dipti"), Student(3, "Tamanna"),}; std::cout<<"Students in the list before sorting were : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; list_Students.sort(StudentComp()); std::cout<<"After sorting students based on name : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; }
Output : Students in the list before sorting were : 15 :: Aditya 6 :: Sujeet 41 :: Arhan 28 :: Dipti 3 :: Tamanna After sorting students based on name : 15 :: Aditya 41 :: Arhan 28 :: Dipti 6 :: Sujeet 3 :: Tamanna
Sorting a List of Objects with Custom Comparator & Lambda Function :
List sort c++: Instead of defining a separate Function object we can sort the list of students by using Lambda function by passing lambda function in sort()
as argument.
#include <iostream> #include <list> #include <string> #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; } }; struct StudentComp { // Compares 2 student objects based on their names bool operator ()(const Student & stud1, const Student & stud2) { if(stud1.name == stud2.name) return stud1 < stud2; return stud1.name < stud2.name; } }; int main(){ std::list<Student> list_Students = { Student(15, "Aditya"), Student(6, "Sujeet"), Student(41, "Arhan"), Student(28, "Dipti"), Student(3, "Tamanna"),}; std::cout<<"Students in the list before sorting were : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; // Sort student list using Lambda function list_Students.sort([](const Student & stud1, const Student & stud2) { if(stud1.name == stud2.name) return stud1 < stud2; return stud1.name < stud2.name; }); std::cout<<"After sorting students based on name : "<<std::endl; for(Student & stud : list_Students) std::cout<<stud.roll<< " :: "<<stud.name<<std::endl; }
Output : Students in the list before sorting were : 15 :: Aditya 6 :: Sujeet 41 :: Arhan 28 :: Dipti 3 :: Tamanna After sorting students based on name : 15 :: Aditya 41 :: Arhan 28 :: Dipti 6 :: Sujeet 3 :: Tamanna