日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

15.确保“lessT“与“operator小于“具有相同的语义

發布時間:2024/4/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15.确保“lessT“与“operator小于“具有相同的语义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Widget類定義如下:

class Widget { public:...size_t weight() const;size_t maSpeed() const;... }

通常情況下,按重量對Widget進行排序是最自然的方式。Widget的operator < 反映了這一點。

bool operator < (const Widget& lhs, const Widget& rhs) {return lhs.weight() < rhs.weight(); }

但是在某種情況下,我們需要創建一個按照最大速度進行排序的multiset容器。mutliset的默認比較函數是less,而less在默認情況下會調用operator <來完成自己的工作。

為了讓multiset按照最大速度進行排序,一種顯而易見的實現方式是:特化less,切斷less和operator < 之間的關系,讓它只考慮Widget的最大速度:

template<>? struct std::less<Widget> : public std::binary_function<Widget, Widget, bool> {bool operator () (const Widget& lhs, const Widget& rhs) const?{return lhs.maxSpeed() < rhs.maxSpeed();} }

operator < 不僅僅是less的默認實現方式,它也是程序員期望less所做的事情,讓less不調用operator < 而去做別的事情,這會無端違背程序員的意愿,這與"最小給人驚奇"原則完全背道而馳,應該完全避免。

在STL中,凡是使用了less的地方你都可以指定另外的一個比較類型。然后讓它來完成你期望的比較操作:

struct ?MaxSpeedCompare : public binary_function<Widget, Widget, bool> {bool operator () (const Widget& lhs, const Widget& rhs) const?{return lhs.maxSpeed() < rhs.maxSpeed();} }

為了創建新的multiset,使用MaxSpeedCompare作為比較類型,這樣就避免使用了默認的比較類型(less):
multiset datas;它創建了一個存放Widget的multiset容器,排序規則由MaxSpeedCompare定義。

相比之下,mutliset datas;說明了datas是一個采用默認排序方式的、存放Widget對象的mutliset容器。這意味著它使用less進行排序,但事實上所有人都會假設它是通過operator <來排序的。

應該盡量避免修改less的行為,因為這樣做很可能會誤導其他人。如果你使用了less,無論是顯示還是隱式,都需要確保它與operator <具有相同的意義。如果你希望以一種特殊的方式來排序對象,那么最好創建一個特殊的函數子類,它的名字不能是less。

總結

以上是生活随笔為你收集整理的15.确保“lessT“与“operator小于“具有相同的语义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。