How to Sort using Member Function as Comparator in C++?
Last Updated :
23 Jul, 2024
In C++, sorting is a common operation that can be customized by providing a comparator function. When working with classes, we might need to sort objects based on their member variables. Using a member function as a comparator is a good technique to achieve this.
In this article, we will learn how to sort using a member function as a comparator in C++.
Example:
Consider an example, where we have a Student
class with name
and age
as its attributes and we want to sort a vector of Student
objects based on the age
attribute.
Input:
vector<Student> students = {
Student("Alice", 23),
Student("Bob", 20),
Student("Charlie", 22)
};
Output:
Sorted students by age:
Bob 20
Charlie 22
Alice 23
Ways to Sort Using Member Function as Comparator
There are two efficient approaches to sort using a member function as a comparator in C++:
1. Sort Using a Static Member Function
In C++, the static member function is defined within the class and can be used directly as a comparator in the std::sort function. This function compares two objects of the class and determines their order based on a specific member variable, although it can access only static members of the class, but can be used as a comparator.
Example:
C++
// C++ Program to illustrate how to sort using a static
// member function
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
// define a class with a compare member function
class Student {
public:
string name;
int age;
// Constructor
Student(string n, int a)
: name(n)
, age(a)
{
}
// Static member function to compare students by age
static bool compareByAge(const Student& a,
const Student& b)
{
return a.age < b.age;
}
};
int main()
{
// Initialize the vector of Student objects
vector<Student> students
= { Student("Alice", 23), Student("Bob", 20),
Student("Charlie", 22) };
// Sort the vector using the static member function as
// the comparator
sort(students.begin(), students.end(),
Student::compareByAge);
// Output the sorted list of students
cout << "Sorted students by age:" << endl;
for (const Student& student : students) {
cout << student.name << " " << student.age << endl;
}
return 0;
}
OutputSorted students by age:
Bob 20
Charlie 22
Alice 23
Time Complexity: O(n log n), where n is the number of elements
Auxiliary Space: O(1)
2. Sort Using a Lambda Function with Member Function Call
Another approach is to use a lambda function that can be used to call the member function as the comparator, when sorting objects. This allows more flexibility and can access non-static members.
Example:
C++
// C++ Program to illustrate how to sort using a lambda
// function calling a member function
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
// define a class student with a member function to compare
class Student {
public:
string name;
int age;
// Constructor
Student(string n, int a)
: name(n)
, age(a)
{
}
// Member function to compare students by age
bool isYoungerThan(const Student& other) const
{
return age < other.age;
}
};
int main()
{
// Initialize the vector of Student objects
vector<Student> students
= { Student("Alice", 23), Student("Bob", 20),
Student("Charlie", 22) };
// Sort the vector using a lambda function as the
// comparator
sort(students.begin(), students.end(),
[](const Student& a, const Student& b) {
return a.isYoungerThan(b);
});
// Output the sorted list of students
cout << "Sorted students by age:" << endl;
for (const Student& student : students) {
cout << student.name << " " << student.age << endl;
}
return 0;
}
OutputSorted students by age:
Bob 20
Charlie 22
Alice 23
Time Complexity: O(n log n), where n is the number of elements
Auxiliary Space: O(1)
Similar Reads
How to Sort a Vector Using a Custom Comparator in C++? In C++, the std::sort() function sorts the given vector in increasing order by default. The custom comparator is a function that defines the order in which the elements of a std::vector should be sorted. It is passed as the parameter to the std::sort() function.In this article, we will learn how to
4 min read
How to Use Custom Comparator with Set in C++? In C++, sets are associative containers that store unique elements in some sorted order. By default, set store data in increasing order but we can change this using a custom comparator. In this article, we will learn, how to declare a set with a custom comparator in C++ STL. Example Input: Data = {1
2 min read
How to Sort an Array in Descending Order using STL in C++? Sort an array in descending order means arranging the elements in such a way that the largest element at first place, second largest at second place and so on. In this article, we will learn how to sort an array in descending order using STL in C++. ExamplesInput: arr[] = {11, 9, 45, 21};Output: 78
4 min read
How to Initialize Multiset with Custom Comparator in C++? In C++, a multiset container stores the data in a sorted order. By default, this order is increasing order (using < operator as comparator) but we can change this order by providing a custom comparator. In this article, we will learn how to initialize a multiset with a custom comparator function
2 min read
How to Sort an Array of Strings Using Pointers in C++? In C++, sorting an array of strings using pointers is quite different from normal sorting because here the manipulation of pointers is done directly, and then according to which string is pointed by the pointer the sorting is done. The task is to sort a given array of strings using pointers. Example
2 min read
How to Sort a Vector of Custom Objects in C++? In C++, vectors are dynamic arrays and sorting a vector of custom objects means arranging the objects in a certain order. In this article, we will learn how to sort a vector of custom objects in C++. Sorting a Vector of Custom Objects in C++To sort a vector of custom objects in C++, we can use the s
2 min read