STL中vector,Map,Set的實現原理


vector的數據安排以及操作方式,與array非常類似,兩者唯一的區別是空間運用的靈活性,array是靜態空間,一旦配置了就不能改變,如果你想要大一點的空間,就必須首先配置一塊新空間,然后將原來的元素一一復制進來,再把原來的空間釋放給系統。但是vector是動態空間,隨着元素的增加,它的內部機制會自行擴充空間以容納新元素,因此vector的運用對於內存的合理利用與運用的靈活性有很大的幫助,我們再也不必因為害怕空間不足而一開始要求一個大塊頭的array了,我們可以安心使用vector,隨便使用多大空間都可以

    vector的實現技術,關鍵在於其對大小的控制以及重新配置時的數據移動效率,一旦vector的舊有空間滿載,如果客戶端每新增一個元素,vector的內部只是擴充一個元素的空間,實為不智,因為所謂擴充空間,都是配置新空間,復制原來內容,釋放舊空間所需要的時間很多,那么應該怎樣配置空間呢,接下來再說。

   並且vector維護的是一個連續線性空間,所以支持vector隨機存取

注意:

    vector動態增加大小時,並不是在原空間之后持續新空間(因為根本無法保證原空間之后尚有可供配置的空間),而是以原大小的兩倍另外配置一塊較大的空間,然后將內容拷貝過來,然后才開始在原內容之后構造新元素,並釋放原空間,因此,一旦引起空間重新配置,指向原vector的所有迭代器都失效了,這是程序員易犯的一個錯誤,務必小心

 

Map

   Map是關聯容器,以鍵值對的形式進行存儲,方便進行查找,關鍵詞起到索引的作用,值則表示與索引相關聯的數據,以紅黑樹的結構實現,插入刪除等操作都可以在O(log n)時間內完成

  Map基本操作:

  1.map<int ,string> a; map<string,int>;支持多種類型

      2.添加數據:map1.insert(pair<int,string>(102,"wobeitianjia")); 

        map1.insert(map<int,string>::value_type(102,"tianjia"));

        map1[102]="string";

      3.元素查找:map1.find(key)  返回一個迭代器指向鍵值為key的元素,如果沒有找到,返回指向map尾部的迭代器

      4.元素刪除:先查找元素,map<int ,string>::iterator it=map1.find(key); 找到之后map1.erase(it);

  5.map中的swap函數,交換的是兩個容器而不是一個容器中的元素交換

      6.sort函數,因為map中key按照升序進行排列的,所以不能使用sort函數

set

   Set是關聯容器,set中每個元素都只包含一個關鍵字,set支持高效的關鍵字查詢操作---檢查每一個給定的關鍵字是否在set中,set是以紅黑樹的平衡二叉檢索樹結構實現的,支持高效插入刪除,插如元素的時候會自動調整二叉樹的結構,使得每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值,另外還得保證左子樹和右子樹的高度相等

     平衡二叉檢索樹使用中序遍歷算法,檢索效率高於vector,deque,list等容器,另外使用中序遍歷可將鍵值按照從小到大遍歷出來

  構造set集合的主要目的是為了快速檢索,不可直接去修改鍵值

常用操作:

  1.元素插入:insert

  2.中序遍歷:類似vector遍歷(用迭代器)

  3.反向遍歷:利用反向迭代器reverse_iterator

        set<int> s;  set<int>::reverse_iterator rit;  for(rit=s.rbegin();rit!=s.rend();rit++)

  4.元素的刪除:s.erase(2);  s.clear();

  5.元素的檢索:find(),若找到,返回該值迭代器的位置,否則返回最后一個元素后面一個位置s.end()

            it=s.find(5); if(it==s.end()) cout<<"not find"<<endl;else cout<<*it<<endl;

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM