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