在C++中,可以在類Foo
上定義bool operator<()
,stdlib算法(如next_permutation()
)使用該類來推斷排序。C++中的全範圍比較運算符?
但是,只提供一種方法來檢查Foo
的一個實例是否小於另一個實例,並不提供所有可能的比較。例如,這些實例可能是相同的。
是否有標準或協議來支持C++中的全部比較?
這個問題的動機是由Ruby中定義的<=>
「宇宙飛船」操作符,如果接收器分別小於,等於或大於參數,則返回-1,0或1。
在C++中,可以在類Foo
上定義bool operator<()
,stdlib算法(如next_permutation()
)使用該類來推斷排序。C++中的全範圍比較運算符?
但是,只提供一種方法來檢查Foo
的一個實例是否小於另一個實例,並不提供所有可能的比較。例如,這些實例可能是相同的。
是否有標準或協議來支持C++中的全部比較?
這個問題的動機是由Ruby中定義的<=>
「宇宙飛船」操作符,如果接收器分別小於,等於或大於參數,則返回-1,0或1。
所有使用小於比較器的C++標準函數(和類)都不關心對象是否相等。相反,他們使用「等同性」的概念,定義x
和y
等於當且僅當!(x < y) && !(y < x)
。如果x < y
是嚴格的弱順序,則!(x < y) && !(y < x)
是等價關係。
所以不,沒有精確的等價的Ruby飛船,因爲那些C++操作不接受小於,等於或大於三分法。然而,你可以很容易地寫:
template <typename T>
int spaceship(const T &lhs, const T &rhs) {
if (lhs < rhs) return -1;
if (rhs < lhs) return 1;
return 0;
}
謝謝!我很好奇:這個定義是否存在效率問題?這意味着如果你必須檢查等價性,你必須調用'operator <'兩次!鑑於'operator <'是一個任意定義的函數,這裏的代價是任意的,並且可以相加,例如在熱循環中。 –
@DunPeal:通常沒有效率的關注,因爲比較(平均而言)比太空船比較起來要便宜,因此如果你再多做一些比較也沒有關係。毫無疑問,有一些算法能夠以更快或更快的速度運行。例如,有兩種方法可以執行快速排序 - 雙向分區或3向分區。使用'<'3路分區必須每個元素最多進行2次比較,因此對於'<=>'可以比兩個完整的'<'比較(比如'string')更便宜的類型,您將從中受益。 –
@DunPeal:如果給定的類型支持,你可以使用模板特化來優化它,比如'std :: string'通過'std :: string :: compare'成員函數完成。 – dalle
P0515會將此(拼寫,奇怪的是,<=>
)。它應該在C++ 2x
看這裏:http://stackoverflow.com/questions/2194762/how-to-compare-two-objects-the-calling-object-and-the-parameter-in- a-class –