大POD作为排序的元组

joh*_*ers 1 c++ sorting containers struct tuples

我有一个POD,有大约30个不同类型的成员,我想要将数千个POD存储在一个容器中,然后由其中一个成员对该容器进行排序.

例如:

 struct Person{
   int idNumber;
   ....many other members
 }
Run Code Online (Sandbox Code Playgroud)

Person我想要排序的数千个对象idNumber或我选择排序的任何其他成员.

我今天一直在研究这个问题,似乎最有效,或者至少是最简单的解决方案根本就没有用struct,而是使用tuple我可以将索引号传递给自定义比较函数来使用在std::sort.(此页面上的一个示例显示了一种轻松实现此类排序的方法,但是对于单个成员而言struct,这样做会使得模板化不那么容易,因为您必须按名称引用成员,而不是通过索引引用tuple提供.)

关于这种方法我的两部分问题是:1)元组是否可以接受相当大,有几十个成员?2)是否有一个同样优雅的解决方案继续使用struct而不是tuple为此?

jro*_*rok 6

您可以创建一个比较器,用于存储指向成员的指针,以便它知道要将哪个成员用于比较:

struct POD {
    int i;
    char c;
    float f;
    long l;
    double d;
    short s;
};

template<typename C, typename T>
struct Comp {

    explicit Comp(T C::* p) : ptr(p) {}

    bool operator()(const POD& p1, const POD& p2) const
    {
        return p1.*ptr < p2.*ptr;
    }

private:
    T C::* ptr;
};

// helper function to make a comparator easily

template<typename C, typename T>
Comp<C,T> make_comp( T C::* p)
{
    return Comp<C,T>(p);
}

int main()
{
    std::vector<POD> v;
    std::sort(v.begin(), v.end(), make_comp(&POD::i));
    std::sort(v.begin(), v.end(), make_comp(&POD::d));
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

为了进一步概括这一点,make_comp请使用自定义比较器,这样您就可以进行大于和等比较.