STL程式設計實踐六:自定義型別儘量定義恆等和小於運算子 (轉)

gugu99發表於2008-04-28
STL程式設計實踐六:自定義型別儘量定義恆等和小於運算子 (轉)[@more@]

STL設計實踐六:自定義型別儘量定義恆等和小於運算子:namespace prefix = o ns = "urn:schemas--com::office" />

袁小凱

華南理工大學研究所北區研發二部

E –

 

比較操作是非常一般的操作,在使用STL進行程式設計時也是如此。比較操作有六種,分別是:==、!=、>、=、<=。C++內建的資料型別對這些比較操作都提供支援。但要對自定義型別進行比較操作時需要定義運算子,否則不能進行比較操作。那是不是要定義所有這些運算子,一般情況下是這樣的,但在使用STL進行程式設計時,通常情況下只需定義operator ==和operator

operator ==運算子

當你使用STL中的vector自定義型別時,可能你會進行一些操作,必竟你使用vector就是為了對其進行操作。如:

int a[10]={1,2,3,4,5,6,7,8,9,10};

int b[10]={1,3,3,4,5,8,7,8,9,10};

vector vobj(a,a+10);

vector vobj2(b,b+10);

if(vobj==vobj2)

……

在if的判斷條件中比較兩個vector中的元素是否都相等,vector在進行這樣的比較操作時需要用到元素的operator==運算子,int 是內建資料型別,支援operator==操作。當使用自定義型別時你必須保證其有operator==的正確定義。但如果你需要進行不等於比較操作時。

if(vobj != vobj2)

……

if的判斷條件中會vector的operator !=運算子,但是vector的operator !=運算子並不呼叫元素的operator !=運算子,而是以!(==)形式呼叫vector的operator ==運算子。因為在算術中:

!(x==y) 意味 x!=Y

以!(x==y)的形式來表達x!=y,儲存了!=和==運算子之間的關係,也簡化了維護,只需修改operator ==即可。最重要的是降低了對操作的元素的要求,元素在這裡不需定義operator != 運算子。

2. operator

STL中太多的地方需要用到operator

if(vobj < vobj2)

 ……

在if的判斷條件中比較兩個vector的大小,如果某個物件中某個元素比另一個物件中相應的元素大則這個物件就大,vector在進行這樣的比較操作時需要用到元素的operator

if(vobj > vobj2)

……

if的判斷條件中會呼叫vector的operator >運算子,但是vector的operator >運算子並不呼叫元素的operator >運算子,而是以(operator

(x > y) 意味 (y < x)

以(y < x)的形式來表達(x > y),儲存了>和運算子,同樣的道理也不用定義operator >=和 operator <=運算子。因為如下表示式是恆成立的。

A. x >= y意味 !(x < y)

B. x <= y 意味 !(y < x) 意味 !(x > y)

總結:

  STL中太多的地方需要使用這些比較運算子,如果你的自定義型別正確的定義了operator == 和 operator 推匯出其它比較運算子的行為,但STL實作中選用了operator

 

後語:

  寫該文是在看完STL原始碼中的vector實作後的一點心得,也是我個人的學習總結,如果有什麼錯誤請大家指正。

參考:

  1.SGI STL原始碼stl_vector.h line 522。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1003096/,如需轉載,請註明出處,否則將追究法律責任。

相關文章