一、容器元素深淺拷貝
STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是說當(dāng)我們給容器中插入元素的時(shí)候,容器內(nèi)部實(shí)施了拷貝動(dòng)作,將我們要插入的元素再另行拷貝一份放入到容器中,而不是將原數(shù)據(jù)元素直接放進(jìn)容器中,也就是說我們提供的元素必須能夠被拷貝。
class Maker
{
public:
Maker(const char * name, int age){
cout << "構(gòu)造函數(shù)" << endl;
this->pName = new char[strlen(name)+1];
strcpy(this->pName,name);
this->age = age;
}
Maker(const Maker &m){
cout << "拷貝構(gòu)造函數(shù)" << endl;
// 在堆區(qū)分配了strlen(m.pName)+1字節(jié)內(nèi)存
this->pName = new char[strlen(m.pName)+1];
strcpy(this->pName,m.pName);
this->age = m.age;
}
Maker& operator=(const Maker& m) {
cout << "賦值運(yùn)算" << endl;
if(this->pName != NULL) {
delete[] this->pName;
this->pName = NULL;
}
// 在堆區(qū)分配了strlen(m.pName)+1字節(jié)內(nèi)存
this->pName = new char[strlen(m.pName)+1];
strcpy(this->pName,m.pName);
this->age = m.age;
return *this;
}
~Maker() {
cout << "析構(gòu)函數(shù)" << endl;
if(this->pName != NULL){
delete[] this->pName;
this->pName = NULL;
}
}
public:
char * pName;
int age;
};
void test01() {
vector<Maker> v;
// 是將Maker("Emily",18)拷貝一份放到v中
// 1. 拷貝構(gòu)造要能調(diào)用
// 2. 注意淺拷貝問題
v.push_back(Maker("Emily",18));
}
二、STL容器使用時(shí)機(jī)

image.png
- vector的使用場景:比如軟件歷史操作記錄的存儲(chǔ),我們經(jīng)常要查看歷史記錄,比如上一次的記錄,上上次的記錄,但卻不會(huì)去刪除記錄,因?yàn)橛涗浭鞘聦?shí)的描述。
-
deque的使用場景:比如排隊(duì)購票系統(tǒng),對排隊(duì)者的存儲(chǔ)可以采用deque,支持頭端的快速移除,尾端的快速添加。如果采用vector,則頭端移除時(shí),會(huì)移動(dòng)大量的數(shù)據(jù),速度慢。
vector與deque的比較:
(1):vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的開始位置 卻是不固定的。
(2):如果有大量釋放操作的話,vector花的時(shí)間更少,這跟二者的內(nèi)部實(shí)現(xiàn)有關(guān)。
(3):deque支持頭部的快速插入與快速移除,這是deque的優(yōu)點(diǎn)。 - list的使用場景:比如公交車乘客的存儲(chǔ),隨時(shí)可能有乘客下車,支持頻繁的不確實(shí)位置元素的移除插入。
- set的使用場景:比如對手機(jī)游戲的個(gè)人得分記錄的存儲(chǔ),存儲(chǔ)要求從高分到低分的順序排列。
- map的使用場景:比如按ID號存儲(chǔ)十萬個(gè)用戶,想要快速要通過ID查找對應(yīng)的用戶。二叉樹的查找效率,這時(shí)就體現(xiàn)出來了。如果是vector容器,最壞的情況下可能要遍歷完整個(gè)容器才能找到該用戶。
三、空間配置器
容器通過空間配置器取得數(shù)據(jù)存儲(chǔ)空間,空間配置器管理容器的空間
在程序中動(dòng)態(tài)申請,釋放空間,存在的問題
1.出現(xiàn)內(nèi)存碎片問題 2. 一直在因?yàn)樾K內(nèi)存而進(jìn)行內(nèi)存申請,調(diào)用malloc,系統(tǒng)調(diào)用產(chǎn)生性能問題空間配置器 策略:
如果申請的內(nèi)存大小超過128,那么空間配置器就自動(dòng)調(diào)用一級空間配置器。反之調(diào)用二級空間配置器。
一級空間配置器,STL源碼中的一級空間配置器命名為class __malloc_alloc_template ,它很簡單,就是對malloc,free,realloc等系統(tǒng)分配函數(shù)的一層封裝。
二級空間配置器,由一個(gè)內(nèi)存池和自由鏈表配合實(shí)現(xiàn)的。