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(); }但是在某種情況下,我們需要創(chuàng)建一個按照最大速度進行排序的multiset容器。mutliset的默認比較函數(shù)是less,而less在默認情況下會調(diào)用operator <來完成自己的工作。
為了讓multiset按照最大速度進行排序,一種顯而易見的實現(xiàn)方式是:特化less,切斷l(xiāng)ess和operator < 之間的關(guān)系,讓它只考慮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的默認實現(xiàn)方式,它也是程序員期望less所做的事情,讓less不調(diào)用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();} }為了創(chuàng)建新的multiset,使用MaxSpeedCompare作為比較類型,這樣就避免使用了默認的比較類型(less):
multiset datas;它創(chuàng)建了一個存放Widget的multiset容器,排序規(guī)則由MaxSpeedCompare定義。
相比之下,mutliset datas;說明了datas是一個采用默認排序方式的、存放Widget對象的mutliset容器。這意味著它使用less進行排序,但事實上所有人都會假設它是通過operator <來排序的。
應該盡量避免修改less的行為,因為這樣做很可能會誤導其他人。如果你使用了less,無論是顯示還是隱式,都需要確保它與operator <具有相同的意義。如果你希望以一種特殊的方式來排序?qū)ο?#xff0c;那么最好創(chuàng)建一個特殊的函數(shù)子類,它的名字不能是less。
總結(jié)
以上是生活随笔為你收集整理的15.确保“lessT“与“operator小于“具有相同的语义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14.理解copy_if算法的正确实现
- 下一篇: 16.算法调用优先于手写的循环