对自定义对象的向量进行排序,通过重载 < 运算符。

3

我正在尝试对节点向量进行排序。我遵循了这个线程中的建议,并重载了我的结构体的 < 运算符。但是在调用sort之后,我没有得到一个排序后的列表。

struct node
{

    int frequency ;
    char data;

    bool operator < (const node& n1) const
    {
        return (frequency < n1.frequency);
    }
};

我按照以下方式进行排序:
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

leftright指的是什么?在排序后可能需要更新它们。 - 1201ProgramAlarm
那是针对代码中未列出的其他部分。我将它们删除以减少混淆。 - Matt
2个回答

6

由于您正在对指针向量进行排序,但运算符应用于一个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;
});

你的第一个解决方案对于每个指针都使用了一对括号,这是完全没有必要的。解引用指针不需要括号。 - Ryan
我正在尝试让你的解决方案运行起来,但目前为止还没有成功。 - Matt
@Matt 这需要 C++11 或更高版本。VC 没有它;g++ 使用 -std=c++11 选项。 - Sergey Kalinichenko
@dasblinkenlight 我正在使用带有 -std=c++11 选项的 g++。 - Matt
这个有效,问题出在我自己身上导致了它不能正常工作。今晚很晚了,谢了伙计。 - Matt

0

最简单的方法是使用lambda表达式:

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

2
你需要将 &lhs 和 &rhs 改为 *lhs 和 *rhs。通过这些更改,我立即使它工作了。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接