这是我的代码:
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
没有排序,原因是什么?
答案 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
引用传递。理想情况下从不作为副本。