天天看點

C++primer筆記之順序容器

最近又重新拾起C++primer,發現每一次看都會有不同的體驗,但每一次看後因為不常用,忘記得很快,是以記筆記是很關鍵的一環,咋一看是浪費時間,實際上是節省了很多時間。下面就把這一節的内容做一個簡單的提煉和小節:

1、IO庫類型不支援複制或指派,是以,不能建立存放IO類型對象的容器。

2、在指定容器元素為容器類型時,必須如下使用空格:

vector< vector<string> > lines; //OK!

vector< vector<string>> lines;//ERROR! 像這樣,系統會預設>>為單個符号

3、list容器的疊代器既不支援算術運算(加法或減法),也不支援關系運算(<=, <,>等),隻提供前置和後置的自增、自減及相等(不等)運算。

vector<int>::iterator it = vec.begin() + vec.size()/2; //OK!而

list<int>::iterator it = lst.begin() + lst.size()/2; //ERROR!

4、懸垂指針

由懸垂指針可以引出野指針,垃圾記憶體以及記憶體黑洞等相關概念,我們一點點來看:

懸垂指針:當所指向的對象被釋放或者收回,但是對該指針沒有做任何修改,以至于該指針仍舊指向已經回收的記憶體位址,此情況下該指針便稱為懸垂指針(也稱迷途指針)。

一般以如下形式(C++)可以避免懸垂指針:

delete cp;

cp = NULL; //此處一定要記得!

野指針:其産生是由于某些指針在首次使用之前沒有進行必要的初始化,這類指針就稱為野指針。

垃圾記憶體:針對于某個指針來說,常常指不合法的記憶體,某些記憶體free或delete後沒有将其設定為NULL,這樣的記憶體就是垃圾記憶體。

記憶體“黑洞”:和上面三個完全不同的概念,特指對一個指針施加free或delete前就把這個指針設定為NULL,這樣之後,這塊記憶體并不屬于編譯器,它隻屬于某個變量的合法通路區域,但這個通路的指針已經不存在了,這樣這塊記憶體就像一個洞一樣,曰為“黑洞”。

5、push_front()和pop_front()隻适用于list和deque容器

    v[n]和c.at[n]隻适用于vector和deque容器

6、不要存儲end操作傳回的疊代器,添加或删除deque或vector容器内的元素都會導緻存儲的疊代器失效。

7、如果在不同(或相同)類型的容器内,元素類型不同但互相相容,則其指派運算必須适用assign函數,如:可通過assign操作實作将vector容器中一段char*類型的元素賦給string類型的list容器。

8、預設基礎容器類型

預設的stack和queue都基于deque容器實作,而priority_queue則在vector容器上實作。

繼續閱讀