Effective STL 關聯容器

2021-09-23 01:43:04 字數 2059 閱讀 4832

stl中有很多這樣的函式,它們需要確定兩個值是否相同,但這些函式以不同的方式來判斷這兩個值是否相同。find對相同的定義是等價的,是以operator ==為基礎,而set::insert對系統的定義是等價。因此需要了解它們之間的區別。

在實際過程中,相等的概念是基於operator ==的,如果表示式x==y返回真,則x和y的值相等,否則就不相等。但x和y有相等的值並不意味這它們的所有資料成員都有相等的值。

class widget

;bool operator ==

(const widget& lhs,

const widget& rhs)

在這種情況下,兩個widget即使有不同的lastaccessed域,它們也可以有相等的值。

mapopeartor的設計目的是為了提供「新增和更新功能」

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物件,所以它不會構造和析構任何pairwidget

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 使得我的 依賴於...