2 回答

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),其名字/姓氏成員按名字排序,有時則按姓氏排序。兩種不同的功能(或函子)使此類選項變得微不足道。

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ā)出錯誤并使您知道。您可以在需要比較的地方有選擇地顯式使用此比較器或其他比較器。
- 2 回答
- 0 關(guān)注
- 342 瀏覽
添加回答
舉報