为啥排序不适用于矢量?

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] &lt;= 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 引用传递。理想情况下永远不要复制。

【讨论】:

以上是关于为啥排序不适用于矢量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?

为啥排序规则不适用于子查询中的 xml 路径?

为啥我的 ExtJS 4.2 网格面板排序不起作用?

冒泡排序不适用于对 C++ 中的动态对象数组进行排序

Jquery可排序水平列表不适用于固定项目

MongoTemplate 排序不适用于 LocalDateTime