一、同一個(gè)類中除了重載,不允許出現(xiàn)同名的方法
比如:類的靜態(tài)方法和成員函數(shù)的名稱不能相同,雖然一個(gè)是成員函數(shù),另外一個(gè)是非成員函數(shù)。
標(biāo)準(zhǔn)庫(kù)的sort算法操作需要隨機(jī)訪問(wèn)迭代器。
二、STL容器
1 順序容器
vector/dequeue/list forward_list/array/string
vector
可變大小數(shù)組,支持快速隨機(jī)訪問(wèn),使用連續(xù)內(nèi)存保存數(shù)據(jù)。在尾部之外的位置插入或刪除元素可能很慢,因?yàn)榭赡苄枰苿?dòng)多個(gè)元素。插入可能引起內(nèi)存重新分配,導(dǎo)致迭代器全部失效。刪除,刪除點(diǎn)之后的迭代器會(huì)全部失效。
適用于,變化較少,但是隨機(jī)分配頻繁的場(chǎng)景-
dequeue
雙向開口有序序列,支持快速隨機(jī)訪問(wèn),使用動(dòng)態(tài)分段連續(xù)空間組合而成。中間增刪,因?yàn)橐WC連續(xù)性,可能造成前面或者后面所有指針失效,若增加導(dǎo)致map重新配置,會(huì)造成指針有效迭代器失效;
image.pngdeque的儲(chǔ)存空間主體在緩沖區(qū)buffer中,由一段一段的定量連續(xù)空間組成。為了便于迭代器的尋址,除了此儲(chǔ)存空間,deque采用一個(gè)表(map)來(lái)記錄每個(gè)連續(xù)空間的首地址。map是一小塊連續(xù)的空間,每個(gè)元素(node)都是指針,指向buffer中的各首地址。
2 關(guān)聯(lián)容器
- list
雙向循環(huán)鏈表,不支持隨機(jī)訪問(wèn),但是插入和刪除的效率很高,增刪節(jié)點(diǎn)后,只需要修改指針,所有元素的位置都不變,所以迭代器都沒(méi)有失效。
但是遍歷刪除的時(shí)候需要注意,刪除節(jié)點(diǎn)的迭代器會(huì)失效。
for(auto it = objList.begin(); it != objList.end; it++) {
if(*it == 5) {
objList.erase(it++);
}
}
for(auto it = objList.begin(); it != objList.end; ) {
if(*it == 5) {
it = objList.erase(it++); //前置++返回引用 后置++,返回臨時(shí)變量
} else {
it ++;
}
}
- set map
所有元素會(huì)根據(jù)key值自動(dòng)排序,底層結(jié)構(gòu)是紅黑樹。因?yàn)樵夭⑽催B續(xù)存放,所以插入刪除時(shí)原有的迭代器都不會(huì)失效。元素位置和key值強(qiáng)相關(guān),key值不能修改,自定義key時(shí),需要重載<。
unordered_set和unordered_map使用哈希map存儲(chǔ),自定義時(shí)需要重載==,并提供哈希函數(shù)。
3 STL容器適配器: 以現(xiàn)有的容器為底部結(jié)構(gòu),改變接口
stack 和 queue 并非真實(shí)的容器,而是對(duì)底層容器封裝的適配,默認(rèn)底層容器是dequeue,stack和queue都不支持遍歷,也沒(méi)有相應(yīng)的迭代器。
三 函數(shù)對(duì)象
函數(shù)對(duì)象,就是一個(gè)重載'()'運(yùn)算符的類的對(duì)象。這樣就可以直接使用‘對(duì)象名()’的方式,這跟調(diào)用函數(shù)一樣,所以稱謂函數(shù)對(duì)象。
(1)函數(shù)對(duì)象有自己的狀態(tài),即它可以攜帶自己的成員函數(shù),而且這個(gè)函數(shù)對(duì)象在多次調(diào)用的過(guò)程中它的那些狀態(tài)是共享的,而函數(shù)則不能做到這點(diǎn)(除非定義函數(shù)內(nèi)部的靜態(tài)變量或者全局變量)。
(2)函數(shù)對(duì)象有自己的類型,而普通函數(shù)則沒(méi)有。在使用STL的容器時(shí)可以將函數(shù)對(duì)象的類型傳遞給容器作為參數(shù)來(lái)實(shí)例化相應(yīng)的模板,從而來(lái)定制自己的算法,如排序算法。
