基于不同字段的对象矢量排序函数

问题描述 投票:1回答:1

我有一个对象向量:

struct Student{   
  string name;   
  string id;   
  string major;
  int age;
};

vector<Student> s;

有没有一种方法可以编写一个通用(也许是模板)函数来基于不同的字段对这个向量(或数组)进行排序,而不是编写四个不同的函数?

c++ function vector struct member-variables
1个回答
5
投票

[我认为以前的评论都说可以编写这样的比较函数。但是,如果我对您的理解正确,那么您希望所有4个比较都使用一个函数(也许以模板方式)。实际上,在使用成员对象指针时(编辑:是成员function指针,这要感谢@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;
}

请注意,如果所有成员变量都属于同一类型,则甚至不需要模板。您还可以为Comparator<int>提供重载,因为只有一个member成员,所以默认情况下会用&Student::age初始化int,这会稍微减少写工作。

但是我认为关于运行时速度,适当的lambda可能会更快。

© www.soinside.com 2019 - 2024. All rights reserved.