通过重载<对自定义对象的向量进行排序

Sorting a Vector of Custom Objects by overloading <

本文关键字:对象 向量 排序 自定义 重载 lt      更新时间:2023-10-16

我正在尝试对节点向量进行排序。我遵循了这个线程的建议,重载了我的
结构体的<操作符>。然而,我没有得到排序后的列表排序被调用。

struct node
{
    int frequency ;
    char data;
    bool operator < (const node& n1) const
    {
        return (frequency < n1.frequency);
    }
};

我通过以下方式调用sort:

vector<node*> test
//fill test with nodes
sort(test.begin(),test.end());
输出:

Presort data is: 1,1,2,3,3,1,2,1,1
Postsort data is: 3,2,1,1,1,1,2,1,3

由于您正在对指针向量进行排序,但操作符适用于struct,因此c++会忽略操作符<过载。

你可以提供一个自定义比较器来调用你的operator <,像这样

std::sort(test.begin(), test.end(), [](const node* pa, const node* pb) {
    return (*pb) < (*pa);
});

或将比较直接编码到lambda中,并删除<未使用的过载,如下所示:

std::sort(test.begin(), test.end(), [](const node* pa, const node* pb) {
    return pb->frequency < pa->frequency;
});

最简单的方法是使用lambda:

sort(test.begin(),test.end(), [](const node &lhs, const node &rhs){return lhs->frequency < rhs->frequency;});