基于不同字段的对象向量的排序功能
Sorting function for a vector of objects based on different fields
我有一个对象向量:
struct Student{
string name;
string id;
string major;
int age;
};
vector<Student> s;
有没有办法编写一个通用(可能是模板(函数来根据不同的字段对这个向量(或数组(进行排序,而不是编写四个不同的函数?
我想前面的评论都说可以写出这样的比较函数。但是,如果我理解正确,您希望所有 4 个比较都有一个函数(也许以模板化的方式(。确实存在,当使用成员对象指针时(编辑:是成员函数指针,感谢@WhozCraig指出它(:
#include <vector>
#include <algorithm>
#include <iostream>
struct Student {
std::string name;
std::string id;
std::string major;
int age;
};
template<typename T>
struct Comparator {
const T Student::* member;
bool operator()(const Student& stu1, const Student &stu2) const
{
return stu1.*member < stu2.*member;
}
};
int main()
{
Comparator<int> cint{&Student::age};
Comparator<std::string> cstring{&Student::name};
std::vector<Student> vec = {{"Paul", "P", "Mathematics", 42}, {"John", "J", "Computer Science", 43}};
std::sort(begin(vec), end(vec), cint);
for(auto &s: vec)
{
std::cout << s.age << "n";
}
std::sort(begin(vec), end(vec), cstring);
for(auto &s: vec)
{
std::cout << s.name << "n";
}
return 0;
}
请注意,如果所有成员变量都属于同一类型,则甚至不需要模板化。您还可以为默认使用&Student::age
初始化member
Comparator<int>
提供重载,因为只有一个int
成员,这将减少一点编写工作量。
但我认为,关于运行时速度,现有的 lambda 可能会更快。
相关文章:
- 更改运行时优先级队列的排序功能
- 不正确的比较和交换计数器输出用于快速排序功能
- 排序功能在C++中未按预期工作
- 基于不同字段的对象向量的排序功能
- 如何将标准::矢量插入具有自定义排序功能的 std::set 中
- 快速排序功能不一致
- 我的选择排序功能C 有什么问题
- 排序功能不起作用
- 面临CPP中排序功能的问题
- 数组排序功能
- 当我们在C 中已经可以使用STL排序功能时,为什么我们需要学习不同的排序算法
- 排序功能无法正常工作
- 排序功能中的分段错误
- C++:在模板快速排序功能中接收"couldn't deduce template parameter"错误
- 排序功能不起作用(字符串比较问题)
- 为气泡排序功能添加计数器
- C++列表排序功能
- 排序功能不排序
- C++ 使用指针进行选择排序功能
- C++调度程序的排序功能