STL程式設計實踐六:自定義型別儘量定義恆等和小於運算子 (轉)
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
vector
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- STL程式設計實踐七:儘量定義class形式的Function Object (轉)程式設計FunctionObject
- MapReduce程式設計實踐之自定義資料型別程式設計資料型別
- STL程式設計實踐一:謹慎使用下標運算子 (轉)程式設計
- Swift 自定義運算子Swift
- Swift中自定義運算子Swift
- STL程式設計實踐五:巢狀式的型別宣告 (轉)程式設計巢狀型別
- ORACLE 自定義型別[轉]Oracle型別
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- 自定義型別型別
- 瘋狂Java講義_Chapter03資料型別和運算子JavaAPT資料型別
- swift 自定義正規表示式運算子 =~Swift
- KingbaseES 自定義運算子使用示例
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- 型別轉換運算子型別
- 認真一點學 Go:12. 自定義型別和結構體 - 定義Go型別結構體
- 型別自定義格式字串型別字串
- 自定義資料型別資料型別
- Pl/SQL 自定義型別SQL型別
- C#operator關鍵字自定義運算子C#
- 裝個逼:自定義三元運算子
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- JumpList中Recent類別和自定義型別薦型別
- 微信小程式實用小元件:自定義tabbar微信小程式元件tabBar
- 自定義超實用Redis工具類(滿足物件,list,map等型別)Redis物件型別
- 自定義物件池實踐物件
- 資料型別和運算子資料型別
- DM自定義資料型別資料型別
- UnrealEngine建立自定義資產型別Unreal型別
- Linq to sql 自定義型別SQL型別
- ros|自定義訊息型別ROS型別
- rubymine設定自定義快捷程式碼片段
- 微信小程式自定義tabBar微信小程式tabBar
- 微信小程式 自定義tabbar微信小程式tabBar
- 微信小程式自定義事件微信小程式事件
- Nestjs最佳實踐教程(六): 簡化程式碼與自定義約束JS
- STL程式設計實踐三:剖析STL容器的複製構造和賦值特性 (轉)程式設計賦值
- DTD文件型別定義型別
- 型別轉換 運算子過載型別