通过函数对象(伪函数)实现STL中set容器的自定义排序方式

@我不知道a 2024-10-23 11:05:01 阅读 91

set容器中构造的容器默认按照升序排列

<code>#include<set>

#include<iostream>

using namespace std;

int main()

{

set<int> st1;

st1.insert(1);

st1.insert(4);

st1.insert(3);

st1.insert(8);

st1.insert(15);

set<int>::iterator it;

for(it=st1.begin();it!=st1.end();it++)

{

cout<<*it<<" ";

}

cout<<endl;

return 0;

}

运行结果:

可以通过自带的构造方法实现降序的 set容器:

<code>#include<set>

#include<iostream>

using namespace std;

int main()

{

set<int,greater<int>> st1;

st1.insert(1);

st1.insert(4);

st1.insert(3);

st1.insert(8);

st1.insert(15);

set<int>::iterator it;

for(it=st1.begin();it!=st1.end();it++)

{

cout<<*it<<" ";

}

cout<<endl;

return 0;

}

                                                                       运行结果:

那若是需求set容器存储一系列对象,并按照对象的某个成员排序该如何做呢?

这里定义一个学生类,类中包含学生姓名(name),成绩(grade),学号(id),并分布别实现导入学生信息到set容器中后,自动按照成绩降序、升序排列,读者也可以按此方法实现按学号排序。

首先定义学生类:

<code>class Student

{

public:

Student(int id, string name, int grade)

{

this->id = id;

this->name = name;

this->grade = grade;

}

private:

int id;

string name;

int grade;

};

其次通过另一个类实现排序功能(也就是伪函数):

函数对象定义(实现升序排列):

class Function //函数对象,实现排序功能

{

public:

bool operator()(const Student& s1, const Student& s2) const

{

return s1.grade < s2.grade;

}

};

本类不写成员函数,构造函数,仅写一个公用方法提供判断。

这个类的思路是:通过类内实现“()”符号的重载,重载的()执行将传入的参数(两个Student类s1,s2),并比较这两个对象实例的成员grade的大小并返回。

通过"重载()"这个操作定义了一个操作函数,只不过这个函数在一个类中,故称函数对象。

后续在main中 调用insert()方法插入student时调用"()"的重载进行比较。

stu.insert(Student(1, "Tom", 90));

main函数的实现:

int main()

{

set<Student, Function> stu; //创建set类型的对象stu,并指定排序方式为Function

stu.insert(Student(1, "Tom", 90));

stu.insert(Student(2, "Jerry", 40));

stu.insert(Student(3, "Mike", 70));

stu.insert(Student(4, "Lily", 80));

set<Student, Function>::iterator it; ///定义迭代器

//输出set中的元素

for (it = stu.begin(); it!= stu.end(); it++)

{

cout << it->id << " " << it->name << " " << it->grade << endl;

}

return 0;

}

运行结果:

若要实现降序排列,则修改函数对象的重载:

<code> return s1.grade > s2.grade;

运行结果:

在上面的例子中,函数对象(Function)仅仅定义了比较两个对象成员的bool类型函数,传入set容器中就实现了排序,那么具体是如何实现的呢?

在c++标准库中std::less作为一个函数对象,其主要功能就是重载operator(),使其能够用于比较。此时的"<"和">"并未起到实际作用,仅起到返回true或false,判断排序方法的作用,内容如下:

<code>namespace std {

template <class T>

struct less {

bool operator()(const T& lhs, const T& rhs) const {

return lhs < rhs; // 实际上调用了小于运算符

}

};

}

当然我们也可以通过重载operator<的方式实现自定义的降序排列:

struct MyClass {

int value;

bool operator<(const MyClass& other) const {

return this->value < other.value; // 按照 value 进行比较

}

};

两种方法效果一致,不过前者直接使用了set自带的less函数对象,后者通过重载<实现排序。

c++STL还提供了多种比较函数对象,和less用法相似,读者可以自行尝试使用:

greater<T>:用来实现大于比较。

equal_to<T>:用于判断相等。

not_equal_to<T>:用于判断不相等。

greater_equal<T>:用于大于等于比较。

less_equal<T>:用于小于等于比较。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。