15.确保“lessT“与“operator小于“具有相同的语义
Widget類(lèi)定義如下:
class Widget { public:...size_t weight() const;size_t maSpeed() const;... }通常情況下,按重量對(duì)Widget進(jìn)行排序是最自然的方式。Widget的operator < 反映了這一點(diǎn)。
bool operator < (const Widget& lhs, const Widget& rhs) {return lhs.weight() < rhs.weight(); }但是在某種情況下,我們需要?jiǎng)?chuàng)建一個(gè)按照最大速度進(jìn)行排序的multiset容器。mutliset的默認(rèn)比較函數(shù)是less,而less在默認(rèn)情況下會(huì)調(diào)用operator <來(lái)完成自己的工作。
為了讓multiset按照最大速度進(jìn)行排序,一種顯而易見(jiàn)的實(shí)現(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的默認(rèn)實(shí)現(xiàn)方式,它也是程序員期望less所做的事情,讓less不調(diào)用operator < 而去做別的事情,這會(huì)無(wú)端違背程序員的意愿,這與"最小給人驚奇"原則完全背道而馳,應(yīng)該完全避免。
在STL中,凡是使用了less的地方你都可以指定另外的一個(gè)比較類(lèi)型。然后讓它來(lái)完成你期望的比較操作:
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作為比較類(lèi)型,這樣就避免使用了默認(rèn)的比較類(lèi)型(less):
multiset datas;它創(chuàng)建了一個(gè)存放Widget的multiset容器,排序規(guī)則由MaxSpeedCompare定義。
相比之下,mutliset datas;說(shuō)明了datas是一個(gè)采用默認(rèn)排序方式的、存放Widget對(duì)象的mutliset容器。這意味著它使用less進(jìn)行排序,但事實(shí)上所有人都會(huì)假設(shè)它是通過(guò)operator <來(lái)排序的。
應(yīng)該盡量避免修改less的行為,因?yàn)檫@樣做很可能會(huì)誤導(dǎo)其他人。如果你使用了less,無(wú)論是顯示還是隱式,都需要確保它與operator <具有相同的意義。如果你希望以一種特殊的方式來(lái)排序?qū)ο?#xff0c;那么最好創(chuàng)建一個(gè)特殊的函數(shù)子類(lèi),它的名字不能是less。
總結(jié)
以上是生活随笔為你收集整理的15.确保“lessT“与“operator小于“具有相同的语义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 14.理解copy_if算法的正确实现
- 下一篇: 16.算法调用优先于手写的循环