在stl
中有很多這樣的函式,它們需要確定兩個值是否相同,但這些函式以不同的方式來判斷這兩個值是否相同。find
對相同的定義是等價的,是以operator ==
為基礎,而set::insert對系統的定義是等價。因此需要了解它們之間的區別。
在實際過程中,相等的概念是基於operator ==
的,如果表示式x==y
返回真,則x和y的值相等,否則就不相等。但x和y有相等的值並不意味這它們的所有資料成員都有相等的值。
class widget
;bool operator ==
(const widget& lhs,
const widget& rhs)
在這種情況下,兩個widget即使有不同的lastaccessed域,它們也可以有相等的值。
map
的opeartor
的設計目的是為了提供「新增和更新功能」
map m;
m[k]
= v;
具體工作方式如下:operator返回乙個引用,它指向與k相關聯的值物件。然後v被賦給該引用所指向的物件。如果鍵k已經有了相關聯的值,則該值被更新。但如果k還沒有在對映表中,那就沒有operator可以指向的值物件。在這種情況下,它使用值型別的預設建構函式建立乙個新的物件,然後operator就能返回乙個指向該新物件的引用了。
假定有個widget類,它支援預設建構函式,並根據乙個double值來構造和賦值:
class widget
建立乙個map
,並想用特定的值來對該對映表進行初始化。
map<
int,widget> m;m[1
]=1.50;m[
2]=3.67;m[
3]=10.5;m[
4]=45.8;m[
5]=0.0003
;
m[1]
=1.5
; 該表示式等價於如下
typedef map<
int,widget> intwidgetmap;
pair:iterator,bool> result = m.
insert
(intwidgetmap:
:value_type(1
,widget()
)); 用鍵值1和預設構造的值物件建立乙個新的map條目。
result.first->second =
1.5; 又根據需求對widget賦值一次
上述方式可以換成insert方法
m.insert
(intwidgetmap:
:value_type(1
,1.50))
;
note:因此當進行「新增」操作時,insert比operator效率高,然而做更新操作時,即當乙個等價的鍵已經在對映表中時,形勢卻是反過來。
m[k]
= v;
m.insert
(intwidgetmap:
:value_type
(k,v)
).first->second = v;
insert
呼叫需要將乙個乙個intwidgetmap::value_type
型別的引數,所以當我們呼叫insert
時,我們必須構造和析構乙個該型別物件。其中又包含了乙個widget的構造和析構。而operator
不使用pair
物件,所以它不會構造和析構任何pair
或widget
。
note:對效率的考慮,當向對映表中新增元素時,要優先使用insert,而不是operator;而從效率和美學的觀點考慮,結論是:當更新已經在對映表中的元素的值時,要優先選用operator。
《Effective STL》讀書筆記
工作之後更多地接觸到stl,在專案中stl的使用更是屢見不鮮。最近在看此書,有必要小小地總結一下。1.用empty 而不用size 0去判斷容器是否為空 從功能上看,兩者是一樣的。但效能上可能會有所差別。對於vector而言,size 其實就是end begin 因為它是連續記憶體分布,所以這樣計算...
effective stl 容器部分總結
還是很喜歡effective部分的書,看了好幾遍,這裡把stl中和容器相關的一些基本的注意的點進行介紹總結,之後對迭代器等進行總結 1 對序列容器中需要逐個刪除的時候,不能像關聯容器那樣事先對迭代器進行 操作,因為刪除乙個迭代器,會使他自己無效,後面的迭代器也無效,所以應該儲存刪除erase返回的下...
閱讀effective stl 有感(一)
當讀到這本書的時候這有種相見恨晚的感覺啊 邊讀以前寫過的一行行stl 就在自己的腦海中浮現。下面我一條條總結我讀stl的感想 第一條 善用typedef 之前的訪問者模式例子其實可以使用typedef 來寫出節省修改型別時間的 前面的範圍,由於我使用的是osg bouindgbox 使得我的 依賴於...