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<y
和
y<x
都是為假的。也就是說,對 STL 的關聯容器和許多演算法來說,任意兩個類 A 的物件都是相等的,這與
==
運算子的行為無關。
綜上所述,使用 STL 中的關聯容器和許多演算法時,往往需要對
<
運算子進行適當的過載,使得這些容器和演算法可以用
<
運算子對所操作的元素進行比較。最好將
<
運算子過載為全域性函數,因為在過載為成員函數時,在有些編譯器上會出錯(由其 STL 原始碼的寫法導致)。