1.理解相等(equality)和等價(equivalence)的區(qū)別
相等的概念是基于operator==的。等價關(guān)系是以“在已排序的區(qū)間中對象值得相對順序”為基礎(chǔ)的。如果從每個標(biāo)準(zhǔn)關(guān)聯(lián)容器的排列順序來考慮等價關(guān)系,那么著將是有意義的。標(biāo)準(zhǔn)關(guān)聯(lián)容器室基于等價而不是相等的。標(biāo)準(zhǔn)關(guān)聯(lián)容器總是保持排列順序的,所以每個容器必須有一個比較函數(shù)(默認(rèn)less)來決定保持怎樣的順序。等價是按照比較函數(shù)子。因此,標(biāo)準(zhǔn)關(guān)聯(lián)容器的使用者要為所使用的每個容器指定一個比較函數(shù)(用來決定如何排序)。如果該關(guān)聯(lián)容器使用相等來決定兩個對象是否有相同的值,那么每個關(guān)聯(lián)容器除了用于排序的比較函數(shù)外,還需要另一個比較函數(shù)來決定兩個值是否相等(默認(rèn)情況下,該比較函數(shù)應(yīng)該是equal_to,但有趣的是equal_to從來沒有被用做STL的默認(rèn)比較函數(shù)。當(dāng)STL中需要相等判斷時,一般的慣例是直接調(diào)用operator==。比如,非成員函數(shù)find算法就是這么做的)
2.為包含指針的關(guān)聯(lián)容器指定比較類型
why?第一條已經(jīng)說明關(guān)聯(lián)容器是要排序。每當(dāng)你要創(chuàng)建包含指針的關(guān)聯(lián)容器時,一定要記住,容器將會按照指針的值進(jìn)行排序。一般是不是你希望的,所以你幾乎要創(chuàng)建自己的函數(shù)子類作為該容器的比較類型。
3.總是讓比較函數(shù)在等值情況下返回false
比較函數(shù)的返回值表明的是按照該函數(shù)定義的排列順序,一個值是否在另一個之前。相等的值從來不會有前后順序關(guān)系,所以,對于相等的值,比較函數(shù)應(yīng)該始終返回false。
4.切勿直接修改set或multiset中的鍵。
5。考慮用排序的vector替代關(guān)聯(lián)容器
在排序的vector中存儲數(shù)據(jù)可能比在標(biāo)準(zhǔn)關(guān)聯(lián)容器中存儲同樣的數(shù)據(jù)要耗費更少的內(nèi)存,而考慮到頁面錯誤的因素,通過二分搜索法來查找一個排序的vector可能比查找一個標(biāo)準(zhǔn)關(guān)聯(lián)容器要更快一些。
6.當(dāng)效率至關(guān)重要時,請在map::operator[]與map::insert之間謹(jǐn)慎做出選擇
map::operator[]的設(shè)計目的是為了提供“添加和更新”的功能。添加一個新元素最好選后者insert。
7.熟悉非標(biāo)準(zhǔn)的散列容器。