📜  C++中的Comparator类及其示例

📅  最后修改于: 2021-05-19 20:00:12             🧑  作者: Mango

比较器类用于比较用户定义的类的对象。为了开发通用函数使用模板,并且为了使函数更通用,请使用容器,以便可以在数据之间进行比较。

句法:

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等的更多准备工作,请参阅“完整面试准备课程”