17.容器的成员函数优先于同名的算法
有些STL 容器提供了一些與算法同名的成員函數(shù)。大多數(shù)情況下,應(yīng)該使用這些成員函數(shù),而不是相應(yīng)的STL算法。 有兩個(gè)理由:
- 成員函數(shù)往往速度快。
- 成員函數(shù)通常與容器結(jié)合地更緊密,這是算法所不能比的。
set容器的find成員函數(shù)以對(duì)數(shù)時(shí)間運(yùn)行,而find算法以線性時(shí)間運(yùn)行。
效率并不是find成員函數(shù)和find算法之間的唯一差別。STL算法以相同性而判斷兩個(gè)對(duì)象是否具有相同的值,而關(guān)聯(lián)容器使用等價(jià)性來(lái)進(jìn)行它們的"相同性"測(cè)試。因此,在使用關(guān)聯(lián)容器的時(shí)候,應(yīng)該優(yōu)先考慮成員函數(shù)形式的find、count、lower_bound等,而不是相應(yīng)的STL算法,這些成員函數(shù)的行為與關(guān)聯(lián)容器的其他成員函數(shù)能夠保存更好的一致性。由于相等性和等價(jià)性之間的差別,STL算法不可能提供這樣的一致性。
對(duì)于標(biāo)準(zhǔn)的關(guān)聯(lián)容器,選擇成員函數(shù)而不選擇對(duì)應(yīng)的同名算法,這可以帶來(lái)幾方面的好處。
- 可以獲得對(duì)數(shù)時(shí)間的性能,而不是線性時(shí)間的性能。
- 可以使用等價(jià)性來(lái)判斷的那個(gè)兩個(gè)值是否"相同",而等價(jià)性是關(guān)聯(lián)容器的一個(gè)本質(zhì)定義。
- 在使用map和multimap的時(shí)候,將很自然地只考慮元素的鍵部分,而不是完整的鍵值對(duì)。
對(duì)于list,性能幾乎成為了全部考慮元素。
remove、remove_if、unique、sort、merge以及reverse這些算法無(wú)一例外地需要拷貝list容器的對(duì)象,而這些版本的成員函數(shù)則無(wú)需任何對(duì)象拷貝,它們只是簡(jiǎn)單地維護(hù)好那些將list節(jié)點(diǎn)連接起來(lái)的指針。這些算法的時(shí)間復(fù)雜度并沒(méi)有改變,但多數(shù)情況下維護(hù)指針的開(kāi)銷比拷貝對(duì)象要低得多,所以list成員函數(shù)應(yīng)該會(huì)提供更好地性能。
list成員函數(shù)的行為不同于其同名的算法。如果真的要從容器中刪除對(duì)象的話,在調(diào)用remove、remove_if或者unique算法之后,必須接著調(diào)用erase。而list的remove、remove_if、unique成員函數(shù)則實(shí)實(shí)在在地刪除了元素,所以無(wú)需再調(diào)用erase。
sort算法與list的sort函數(shù)之間一個(gè)很重要的區(qū)別是,前者根本不能被應(yīng)用于list容器上,list的迭代器只是雙向迭代器,而sort算法要求隨機(jī)訪問(wèn)迭代器。在merge算法和list的merge成員函數(shù)之間也存在這種區(qū)別。merge算法是不允許修改其源區(qū)間的,而list的merge成員函數(shù)總是在修改它所操作的鏈表。
當(dāng)需要在STL算法與容器的同名成員函數(shù)之間做出選擇的時(shí)候,應(yīng)該優(yōu)先選擇成員函數(shù)。成員函數(shù)的性能更為優(yōu)越,而卻它們更能夠與容器的一貫行為保持一致。
?
總結(jié)
以上是生活随笔為你收集整理的17.容器的成员函数优先于同名的算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 16.算法调用优先于手写的循环
- 下一篇: 18.了解各种与排序有关的选择