C++ STL 其他知識點(diǎn)

一、容器元素深淺拷貝

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)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容