一、STL中遍歷map比遍歷list慢的原因
1、內(nèi)存布局不同
map和list的內(nèi)存布局不同,map是一種基于紅黑樹(shù)實(shí)現(xiàn)的關(guān)聯(lián)容器,其數(shù)據(jù)結(jié)構(gòu)是一棵二叉搜索樹(shù),每個(gè)節(jié)點(diǎn)包含一個(gè)鍵值對(duì)。而list是一種雙向鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)元素和指向前驅(qū)和后繼節(jié)點(diǎn)的指針。由于內(nèi)存布局不同,map在遍歷時(shí)需要進(jìn)行頻繁的內(nèi)存訪問(wèn)和跳轉(zhuǎn),而list的節(jié)點(diǎn)是連續(xù)的,可以直接訪問(wèn),因此遍歷list的速度要快于遍歷map。
2、訪問(wèn)代價(jià)不同
在STL中,map是基于紅黑樹(shù)實(shí)現(xiàn)的,每次訪問(wèn)都需要進(jìn)行一次查找操作,而list是基于雙向鏈表實(shí)現(xiàn)的,可以直接訪問(wèn)節(jié)點(diǎn)。由于map中的節(jié)點(diǎn)是按鍵值有序排列的,每次查找操作的時(shí)間復(fù)雜度為O(log n),而list中的節(jié)點(diǎn)是按插入順序排列的,可以通過(guò)指針直接訪問(wèn),時(shí)間復(fù)雜度為O(1)。因此,在遍歷map和list時(shí),訪問(wèn)map的代價(jià)要高于訪問(wèn)list。
3、數(shù)據(jù)結(jié)構(gòu)特性不同
map和list的數(shù)據(jù)結(jié)構(gòu)特性不同,map是一種關(guān)聯(lián)容器,可以根據(jù)鍵值進(jìn)行查找和訪問(wèn),而list是一種序列容器,只能順序訪問(wèn)。由于map可以根據(jù)鍵值進(jìn)行快速查找,因此在進(jìn)行查找操作時(shí)比list更快。但是在遍歷時(shí),由于map的內(nèi)存布局和訪問(wèn)代價(jià)的限制,其速度要慢于list。