第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

標(biāo)準(zhǔn)庫排序和用戶定義的類型

標(biāo)準(zhǔn)庫排序和用戶定義的類型

C++
喵喵時光機 2019-11-03 04:04:02
如果我想通過它所持有的兩種類型的變量之一對UDT的向量進行排序,則標(biāo)準(zhǔn)庫排序是否可以執(zhí)行此操作,還是我需要編寫自己的排序函數(shù)?例如,如果您有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貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊

如果您的類型實現(xiàn)"bool operator < (...) const"和復(fù)制構(gòu)造函數(shù)(由編譯器生成或自定義),則可以使用標(biāo)準(zhǔn)函數(shù)。


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) { }

};

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


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

...

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

在以下情況下這很有用:


您不想"<"出于任何原因?qū)嵤┻\算符,

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

您希望使用不同的順序?qū)π蛄羞M行排序。例如:有時候您想要一個結(jié)構(gòu),其名字/姓氏成員按名字排序,有時則按姓氏排序。兩種不同的功能(或函子)使此類選項變得微不足道。



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

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊

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


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


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

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


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


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


struct compare_by_a {

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

  {return lhs.a<rhs.a;}

};

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



查看完整回答
反對 回復(fù) 2019-11-04
  • 2 回答
  • 0 關(guān)注
  • 342 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號