为啥排序不适用于矢量?
Posted
技术标签:
【中文标题】为啥排序不适用于矢量?【英文标题】:why sort not work for vector?为什么排序不适用于矢量? 【发布时间】:2016-05-17 06:27:08 【问题描述】:这是我的代码:
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
没有排序,这是什么原因?
【问题讨论】:
【参考方案1】:原因是你的逻辑不通......
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
b,但a.field.instrument[0]
可能大于b
。
我可以告诉你如何解决它,但你自己想一想,并在纸上尝试几个例子。
【讨论】:
【参考方案2】:您需要将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
引用传递。理想情况下永远不要复制。
【讨论】:
以上是关于为啥排序不适用于矢量?的主要内容,如果未能解决你的问题,请参考以下文章