程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻解析C++ STL中的經常使用容器

深刻解析C++ STL中的經常使用容器

編輯:關於C++

深刻解析C++ STL中的經常使用容器。本站提示廣大學習愛好者:(深刻解析C++ STL中的經常使用容器)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C++ STL中的經常使用容器正文


STL是C/C++開辟中一個異常主要的模板,而個中界說的各類容器也長短常便利我們年夜家應用。上面,我們就淺談某些經常使用的容器。這裡我們不觸及容器的根本操作之類,只是要評論辯論一下各個容器其各自的特色。STL中的經常使用容器包含:次序性容器(vector、deque、list)、聯系關系容器(map、set)、容器適配器(queue、stac)。

1、次序性容器

(1)vector
vector是一種靜態數組,在內存中具有持續的存儲空間,支撐疾速隨機拜訪。因為具有持續的存儲空間,所以在拔出和刪除操作方面,效力比擬慢。vector有多個結構函數,默許的結構函數是結構一個初始長度為0的內存空間,且分派的內存空間是以2的倍數靜態增加的,即內存空間增加是依照20,21,22,23.....增加的,在push_back的進程中,若發明分派的內存空間缺乏,則從新分派一段持續的內存空間,其年夜小是如今持續空間的2倍,再將本來空間中的元素復制到新的空間中,機能消費比擬年夜,特別是當元素長短外部數據時(非外部數據常常結構及拷貝結構函數相當龐雜)。vector的另外一個罕見的成績就是clear操作。clear函數只是把vector的size清為零,但vector中的元素在內存中並沒有清除,所以在應用vector的進程中會發明內存消費會愈來愈多,招致內存洩漏,如今常常用的辦法是swap函數來停止處理:

vector<int> V;
V.push_back(1);
V.push_back(2);
V.push_back(1);
V.push_back(2);
vector<int>().swap(V);
//或許 V.swap(vector<int>());

應用swap函數,和暫時對象交流,使V對象的內存為暫時對象的內存,而暫時對象的內存為V對象的內存。交流今後,暫時對象消逝,釋放內存。

(2)deque
deque和vector相似,支撐疾速隨機拜訪。兩者最年夜的差別在於,vector只能在末尾拔出數據,而deque支撐雙端拔出數據。deque的內存空間散布是小片的持續,小片間用鏈表相連,現實上外部有一個map的指針。deque空間的從新分派要比vector快,從新分派空間後,原本的元素是不須要拷貝的。

(3)list
list是一個雙向鏈表,是以它的內存空間是可以不持續的,經由過程指針來停止數據的拜訪,這使list的隨機存儲變得異常低效,是以list沒有供給[]操作符的重載。但list可以很好地支撐隨意率性處所的拔出和刪除,只需挪動響應的指針便可。

(4)在現實應用時,若何選擇這三個容器中哪個,應依據你的須要而定,普通應遵守上面的准繩:
1) 假如你須要高效的隨即存取,而不在意拔出和刪除的效力,應用vector
2) 假如你須要年夜量的拔出和刪除,而不關懷隨即存取,則應應用list
3) 假如你須要隨即存取,並且關懷兩頭數據的拔出和刪除,則應應用deque

2、聯系關系容器

(1)map
map是一種聯系關系容器,該容器用獨一的症結字來映照響應的值,即具有key-value功效。map外部自建一棵紅黑樹(一種自均衡二叉樹),這棵樹具稀有據主動排序的功效,所以在map外部一切的數據都是有序的,以二叉樹的情勢停止組織。

這是map的模板:
template < class Key, class T, class Compare= less<Key>, class Allocator=allocator< pair<const Key,T> > > class map;

從模板中我們可以看出,再結構map時,是依照必定的次序停止的。map的拔出和刪除效力比其他序列的容器高,由於對聯系關系容器來講,不須要做內存的拷貝和挪動,只是指針的挪動。因為map的每一個數據對應紅黑樹上的一個節點,這個節點在不保留你的數據時,是占用16個字節的,一個父節點指針,閣下孩子指針,還有一個列舉值(標示紅黑色),所以map的個中的一個缺陷就是比擬占用內存空間。

(2)set
set也是一種聯系關系性容器,它同map一樣,底層應用紅黑樹完成,拔出刪除操作時僅僅挪動指針便可,不觸及內存的挪動和拷貝,所以效力比擬高。set中的元素都是獨一的,並且默許情形下會對元素停止升序分列。所以在set中,不克不及直接轉變元素值,由於那樣會打亂本來准確的次序,要轉變元素值必需先刪除舊元素,再拔出新元素。不供給直接存取元素的任何操作函數,只能經由過程迭代器停止直接存取。

set模板原型:
template <class Key, class Compare=class<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > class set;

set支撐聚集的交(set_intersection)、差(set_difference)、並(set_union)及對稱差(set_symmetric_difference) 等一些聚集上的操作。

3、容器適配器

(1)queue
queue是一個隊列,完成先輩先出功效,queue不是尺度的STL容器,卻以尺度的STL容器為基本。queue是在deque的基本上封裝的。之所以選擇deque而不選擇vector是由於deque在刪除元素的時刻釋放空間,同時在從新請求空間的時刻無需拷貝一切元素。

其模板為:
template < TYPENAME _Sequence="deque<_TP" typeneam _Tp,> > class queue;

(2)stack
stack是完成先輩後出的功效,和queue一樣,也是外部封裝了deque,這也是為啥稱為容器適配器的緣由吧(純屬猜想)。本身不直接保護被控序列的模板類,而是它存儲的容器對象來為它完成一切的功效。stack的源代碼道理和完成方法均跟queue雷同。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved