【问题标题】: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 没有排序,这是什么原因?

【问题讨论】:

    标签: c++ sorting stl


    【解决方案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 引用传递。理想情况下永远不要复制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2023-03-14
        相关资源
        最近更新 更多