国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-06 06:17:27
字體:
來源:轉載
供稿:網友

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;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武宣县| 巩留县| 宁夏| 庆元县| 郯城县| 扶沟县| 耿马| 宁海县| 花垣县| 南丹县| 安塞县| 天祝| 都兰县| 舟曲县| 区。| 新乡县| 铁力市| 宜川县| 巴林左旗| 西青区| 淮滨县| 益阳市| 特克斯县| 全南县| 眉山市| 米林县| 乳源| 杨浦区| 密云县| 论坛| 青铜峡市| 仲巴县| 清镇市| 尚志市| 扎鲁特旗| 太康县| 宁国市| 武汉市| 潜江市| 保靖县| 靖江市|