STL中「大」、「小」和「相等」的概念

2020-07-16 10:04:25
STL 中關聯容器內部的元素是排序的。STL 中的許多演算法也涉及排序、查詢。這些容器和演算法都需要對元素進行比較,有的比較是否相等,有的比較元素大小。

在 STL 中,預設情況下,比較大小是通過<運算子進行的,和>運算子無關。在STL中提到“大”、“小”的概念時,以下三個說法是等價的:
  • x 比 y 小。
  • 表示式x<y為真。
  • y 比 x 大。

一定要注意,y比x大意味著x<y為真,而不是y>x為真y>x的結果如何並不重要,甚至y>x是沒定義的都沒有關係。

在 STL 中,x和y相等也往往不等價於x==y為真。對於在未排序的區間上進行的演算法,如順序查詢演算法 find,查詢過程中比較兩個元素是否相等用的是==運算子;但是對於在排好序的區間上進行查詢、合併等操作的演算法(如折半查詢演算法 binary_search,關聯容器自身的成員函數 find)來說,x和y相等是與x<y和y<x同時為假等價的,與==運算子無關。看上去x<y和y<x同時為假就應該和x==y為真等價,其實不然。例如下面的 class A:
class A
{
    int v;
public:
    bool operator< (const A & a)const {return false;}
};
可以看到,對任意兩個類 A 的物件 x、y,x<yy<x都是為假的。也就是說,對 STL 的關聯容器和許多演算法來說,任意兩個類 A 的物件都是相等的,這與==運算子的行為無關。

綜上所述,使用 STL 中的關聯容器和許多演算法時,往往需要對<運算子進行適當的過載,使得這些容器和演算法可以用<運算子對所操作的元素進行比較。最好將<運算子過載為全域性函數,因為在過載為成員函數時,在有些編譯器上會出錯(由其 STL 原始碼的寫法導致)。