亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

標準庫排序和用戶定義的類型

標準庫排序和用戶定義的類型

C++
喵喵時光機 2019-11-03 04:04:02
如果我想通過它所持有的兩種類型的變量之一對UDT的向量進行排序,則標準庫排序是否可以執行此操作,還是我需要編寫自己的排序函數?例如,如果您有struct MyType{ int a; int b;};vector<MyType> moo;// do stuff that pushes data back into moosort(moo.begin(), moo.end()) // but sort it by lowest to highest for a, not b那么可以使用stdlib排序嗎?謝謝。
查看完整描述

2 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

如果您的類型實現"bool operator < (...) const"和復制構造函數(由編譯器生成或自定義),則可以使用標準函數。


struct MyType {

    int a;

    int b;

    bool operator < (const MyType& other) const {

        ... // a meaningful implementation for your type

    }

    // Copy constructor (unless it's a POD type).

    MyType(const MyType &other)

        : a(other.a), b(other.b) { }

    // Some other form of construction apart from copy constructor.

    MyType()

        : a(0), b(0) { }

};

另外,您可以將排序函數(或函子)作為第三個參數傳遞給,sort()而不是實現operator "<"。


bool type_is_less(const MyType& t1, const MyType& t2) { ... }

...

std::sort(c.begin(), c.end(), type_is_less);

在以下情況下這很有用:


您不想"<"出于任何原因實施運算符,

您需要對不能重載運算符的內置或指針類型的容器進行排序。

您希望使用不同的順序對序列進行排序。例如:有時候您想要一個結構,其名字/姓氏成員按名字排序,有時則按姓氏排序。兩種不同的功能(或函子)使此類選項變得微不足道。



查看完整回答
反對 回復 2019-11-04
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

有三種方法可以做到這一點:


您可以operator<為您的課程重載:


bool operator<(const MyType& lhs, const MyType& rhs) {return lhs.a<rhs.a;}

這樣做的缺點是,如果您想根據進行排序b,那么您很不走運。


您也可以專門std::less針對您的類型。這樣就可以進行std::sort工作(以及其他一些事情,例如在地圖中使用類型作為鍵),而不必operator<為此劫持。但是,它確實仍然劫持了的通用比較語法a,而您可能會在代碼的其他位置根據來比較類型b。


或者您可以這樣編寫自己的比較器:


struct compare_by_a {

  bool operator()(const MyType& lhs, const MyType& rhs) const

  {return lhs.a<rhs.a;}

};

(注意:const操作符不是嚴格必需的。不過,我仍然認為它是好的樣式。)這使通用比較方法不確定。因此,如果某些代碼想要在您不知情的情況下使用它們,則編譯會發出錯誤并使您知道。您可以在需要比較的地方有選擇地顯式使用此比較器或其他比較器。



查看完整回答
反對 回復 2019-11-04
  • 2 回答
  • 0 關注
  • 345 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號