一、vector, list, map等容器使用場合
vector適用于對象簡單,變化較小,并且頻繁隨機(jī)訪問的場景。list適用經(jīng)常進(jìn)行插入和刪除并且不經(jīng)常隨機(jī)訪問的場景。map主要用于資料一對一映射的情況,map內(nèi)部自建一棵紅黑樹,這棵樹具有對數(shù)據(jù)自動(dòng)排序的功能。以在map內(nèi)部所有的數(shù)據(jù)都是有序的。比如一個(gè)班級中,每個(gè)學(xué)生的學(xué)號跟他的姓名就存在著一對一映射的關(guān)系。
list封裝鏈表,以鏈表形式實(shí)現(xiàn),不支持[]運(yùn)算符。對隨機(jī)訪問的速度很慢(需要遍歷整個(gè)鏈表),插入數(shù)據(jù)很快(不需要拷貝和移動(dòng)數(shù)據(jù),只需改變指針的指向)。新添加的元素,list可以任意加入。vector封裝數(shù)組,使用連續(xù)內(nèi)存存儲(chǔ),支持[]運(yùn)算符。對隨機(jī)訪問的速度很快,對頭插元素速度很慢,尾插元素速度很快新添加的元素,vector有一套算法。map采用平衡檢索二叉樹:紅黑樹存儲(chǔ)結(jié)構(gòu)為鍵值對延伸閱讀:
二、vector的內(nèi)存管理與效率
當(dāng)元素需要插入且容器的容量不足時(shí)會(huì)發(fā)生重新分配。這會(huì)導(dǎo)致vector的原始內(nèi)存分配和回收、對象的拷貝和析構(gòu)和迭代器、指針和引用的失效。
問題產(chǎn)生的原因:vector容器分配的是一塊連續(xù)的內(nèi)存空間,每次容器的增長,并不是在原有連續(xù)的內(nèi)存空間后再進(jìn)行簡單的疊加,而是重新申請一塊更大的新內(nèi)存(一般是當(dāng)前大小的1.5~2倍的新內(nèi)存區(qū)),并把現(xiàn)有容器中的元素逐個(gè)復(fù)制過去,同時(shí)銷毀舊的內(nèi)存。
問題解決方法
提前使用reserve()函數(shù)設(shè)定容器大小,在vector操作的末尾添加vector