2015-10-24 74 views
3

我想排序节点的向量。 我遵循this thread的建议并且超载了我的
struct的<运营商。但是,在调用排序之后,我没有获得排序列表。通过重载对自定义对象的向量排序<

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 
+0

“left”a nd'right'是指?排序后可能需要更新它们。 – 1201ProgramAlarm

+0

这是代码中未列出的其他部分。我删除它们以减少混淆 – Matt

回答

5

既然要排序的指针的向量,但运营商适用于struct,C++忽略你的运营商<过载。

您可以提供呼叫您operator <自定义比较,类似这样的

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

或代码的比较直入拉姆达,丢弃的<未使用过载,像这样:

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

您的第一个解决方案对每个指针使用一对括号,这是完全无用的。解引用指针不需要括号。 –

+0

我试图让你的解决方案能够正常工作,但至今还没有运气 – Matt

+0

@Matt这需要C++ 11或更高版本。 VC没有它; g ++使用'-std = C++ 11'选项。 – dasblinkenlight

0

最简单的方法是使用lambdas:

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

您需要将&lhs和&rhs更改为* lhs和* rhs。通过这些改变,我能够立即开始工作 – Matt