为什么排序不适合矢量?

时间:2016-05-17 06:27:08

标签: c++ sorting stl

这是我的代码:

vector<EntryMsg> entryMsgs; // i store some Entry Msg in this vector

void step5(vector<EntryMsg> entryMsg)
{
    sort(entryMsg.begin(), entryMsg.end(), [](const EntryMsg& a, const EntryMsg& b) { 
        return (a.fields.instrument[0] <= b.fields.instrument[0]) || (a.fields.instrument[1] <= b.fields.instrument[1]) || (a.fields.instrument[2] <= b.fields.instrument[2]);
    });
    for_each(entryMsg.begin(), entryMsg.end(), [](const EntryMsg& msg){
        cout<<msg.fields.instrument[0]<<msg.fields.instrument[1]<<msg.fields.instrument[2]<<endl;
    });
}

我用它来调用它:step5(entryMsgs);

但是从输出中我发现entryMsgs没有排序,原因是什么?

2 个答案:

答案 0 :(得分:2)

原因是你的逻辑错误......

return (a.fields.instrument[0] <= b.fields.instrument[0]) || (a.fields.instrument[1] <= b.fields.instrument[1]) || (a.fields.instrument[2] <= b.fields.instrument[2])

例如,如果a.fields.instrument[1] <= b.fields.instrument[1]您返回true表示a&lt; b,但a.field.instrument[0]可能大于b

我可以告诉你如何修复它,但要自己思考,并在纸上尝试几个例子。

答案 1 :(得分:1)

您需要将vector作为参考

传递
void step5(vector<EntryMsg>& entryMsg)
{
    sort(entryMsg.begin(), entryMsg.end(), [](const EntryMsg& a, const EntryMsg& b) { 
        return (a.fields.instrument[0] <= b.fields.instrument[0]) || (a.fields.instrument[1] <= b.fields.instrument[1]) || (a.fields.instrument[2] <= b.fields.instrument[2]);
    });
    for_each(entryMsg.begin(), entryMsg.end(), [](const EntryMsg& msg){
        cout<<msg.fields.instrument[0]<<msg.fields.instrument[1]<<msg.fields.instrument[2]<<endl;
    });
}

如果被调用的函数没有修改它,那么这些大对象应该总是作为引用传递,或者作为const引用传递。理想情况下从不作为副本。

相关问题