比较器类用于比较用户定义的类的对象。为了开发通用函数使用模板,并且为了使函数更通用,请使用容器,以便可以在数据之间进行比较。
句法:
class comparator_class {
public:
// Comparator function
bool operator(object o1, object o2)
{
// There can be any condition
// implemented as per the need
// of the problem statement
return (o1.data_member
== o2.data_member);
}
}
说明:上面的比较器函数运算符()类一次获取两对对象,如果两个运算符的数据成员相同,则返回true。根据比较器函数问题的需要,可以有任何条件。在上面的示例中,如果数据成员相同,则该函数返回true。
范例1:
为了在数组元素上实现线性搜索,可以轻松实现在给定数组中搜索整数。但是,像数组一样,在用户定义的数据类型上搜索任何元素都不容易实现。在这种情况下,将使用比较器类来实现它。以下是相同的程序:
C++
// C++ program for the Comparator Class
// for implementing linear search
#include
using namespace std;
// Generic function to search for object
template
ForwardIterator search(
ForwardIterator start,
ForwardIterator end, T key)
{
// Iterate until start equals to end
while (start != end) {
// If the value with given key is
// found the return that index
if (*start == key) {
return start;
}
start++;
}
return end;
}
// Student Class
class student {
public:
// To store Name and Roll Number
string name;
int rollnum;
// Overloaded Constructor
student(string name, int rollnum)
{
this->name = name;
this->rollnum = rollnum;
}
};
// Comparator Class to compare 2 objects
class studentcompare {
public:
// Comparator function
bool operator()(student a,
student b)
{
// If values are the same then
// return true
if (a.name == b.name) {
return true;
}
return false;
}
};
// Driver Code
int main()
{
// Object of class student
student s1("Raj", 23);
student s2("Prerna", 24);
// List of students
list s;
s.push_back(s1);
s.push_back(s2);
// Search student("Prerna", 24)
student searchstudent("Prerna", 24);
studentcompare cmp;
// Print if element is found
if (cmp(s2, searchstudent)) {
cout << "Student found!";
}
else {
cout << "Not found";
}
return 0;
}
C++
// C++ program for the Comparator Class
// implementing sorting
#include
using namespace std;
// Student Class
class student {
public:
// To store Name and Roll Number
string name;
int rollnum;
// Overloaded Constructor
student(string name, int rollnum)
{
this->name = name;
this->rollnum = rollnum;
}
};
// Comparator Class to compare 2 objects
class studentcompare {
public:
// Comparator function
bool operator()(const student& a,
const student& b)
{
// Compare on basis of roll number
if (a.rollnum < b.rollnum) {
return true;
}
return false;
}
};
// Driver Code
int main()
{
// Object of class student
student s1("Raj", 23);
student s2("Prerna", 24);
student s3("Harshit", 21);
// List of students
list s;
s.push_back(s1);
s.push_back(s2);
s.push_back(s3);
// Creating object of
// comparator class
studentcompare cmp;
// Passing the object of
// comparator class to sort()
s.sort(cmp);
// Printing the list after sorting
for (auto stu : s) {
cout << stu.name << " ";
}
return 0;
}
输出:
Student found!
解释:
- 在以上程序中,列出了一个学生对象,其中最初插入了两个学生对象。
- 现在,为了搜索特定的学生,编写了一个模板线性搜索函数,该函数利用了比较器类。
- 比较器类根据其姓名属性从学生列表中比较要搜索的学生。
- 如果要搜索的对象的名称属性等于列表中该对象的任何名称属性,则它返回true,否则返回false。
范例2:
让我们再举一个使用Comparator类进行排序的示例,假设任务是根据对象的属性值对对象数组进行排序,然后创建一个自定义的比较器类,在该类中必须执行该函数的排序可以提到。然后,可以将其作为参数传递给sort()函数。
C++
// C++ program for the Comparator Class
// implementing sorting
#include
using namespace std;
// Student Class
class student {
public:
// To store Name and Roll Number
string name;
int rollnum;
// Overloaded Constructor
student(string name, int rollnum)
{
this->name = name;
this->rollnum = rollnum;
}
};
// Comparator Class to compare 2 objects
class studentcompare {
public:
// Comparator function
bool operator()(const student& a,
const student& b)
{
// Compare on basis of roll number
if (a.rollnum < b.rollnum) {
return true;
}
return false;
}
};
// Driver Code
int main()
{
// Object of class student
student s1("Raj", 23);
student s2("Prerna", 24);
student s3("Harshit", 21);
// List of students
list s;
s.push_back(s1);
s.push_back(s2);
s.push_back(s3);
// Creating object of
// comparator class
studentcompare cmp;
// Passing the object of
// comparator class to sort()
s.sort(cmp);
// Printing the list after sorting
for (auto stu : s) {
cout << stu.name << " ";
}
return 0;
}
输出:
Harshit Raj Prerna
解释:
- 在上面的程序中,列出了一个学生对象列表,其中最初插入了3个学生对象。
- 现在,如果必须根据学生的rollno属性对学生列表进行排序,则必须将自定义比较器类作为参数传递给sort()函数。
- 在比较器类中,必须提及谓词逻辑,该逻辑根据列表的排序返回true或false。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。