技術交流QQ群:1027579432,歡迎你的加入!
1.STL的大、小、相等概念
- 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源代碼的寫法導致)。