STL 裏面的幾個容器簡敘

出處:http://blog.csdn.net/niushuai666/article/details/6654951算法

 

list
1.list的成員函數push_back()把一個對象放到一個list的後面,而 push_front()把對象放到前面
2.list容器不支持在iterator加一個數來指向隔一個的對象。 就是說,咱們不能用Milkshakes.begin()+2來指向list中的第三個對象,由於STL的list是以雙鏈的list來實現的, 它不支持隨機存取。vector和deque(向量和雙端隊列)和一些其餘的STL的容器能夠支持隨機存取
3.使用STL list和 iterator,咱們要初始化、比較和給iterator增量來遍歷這個容器。STL通用的for_each 算法可以減輕咱們的工做.for_each算法引用了iterator範圍的概念,這是一個由起始iterator和一個末尾iterator指出的範圍。 起始iterator指出操做由哪裏開始,末尾iterator指明到哪結束,可是它不包括在這個範圍內。
4.使用iterator範圍時,這個範圍指出一個list或任意 其餘容器中的一部分來處理。一般首iterator指着開始的位置,次iterator指着中止處理的地方。 由次iterator指出的元素不被處理。
5.在STL中有時容器支持它本身對一個特殊算法的實現,這一般是爲了提升性能。list容器有它本身的sort算法,這是由於通用算法僅能爲那些提供隨機存取裏面元素 的容器排序,而因爲list是做爲一個鏈接的鏈表實現的,它不支持對它裏面的元素隨機存取。因此就須要一個特殊的 sort()成員函數來排序list。 
因爲各類緣由,容器在性能須要較高或有特殊效果需求的場合支持外部函數(extra functions), 這經過利用構造函數的結構特性能夠做到。
6.必須確保在兩個尖括號之間或尖括號和名字之間用空格隔開,由於是爲了不同「>>」移位運算符混淆。好比
vector <list<int>> veclis;
這樣寫會報錯,而這樣寫:
vector <list <int> > veclis;
就能夠避免錯誤
7.vector(向量)——STL中標準而安全的數組。只能在vector 的「前面」增長數據。
deque(雙端隊列double-ended queue)——在功能上和vector類似,可是能夠在先後兩端向其中添加數據。 
list(列表)——遊標一次只能夠移動一步。若是你對鏈表已經很熟悉,那麼STL中的list則是一個雙向鏈表(每一個節點有指向前驅和指向後繼的兩個指針)。
set(集合)——包含了通過排序了的數據,這些數據的值(value)必須是惟一的。
map(映射)——通過排序了的二元組的集合,map中的每一個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是惟一的)是在排序或搜索時使用,它的值能夠在容器中從新獲取;而另外一個值是該元素關聯的數值。好比,除了能夠ar[43] = "overripe"這樣找到一個數據,map還能夠經過ar["banana"] = "overripe"這樣的方法找到一個數據。若是你想得到其中的元素信息,經過輸入元素的全名就能夠輕鬆實現。
multiset(多重集)——和集合(set)類似,然而其中的值不要求必須是惟一的(便可以有重複)。
multimap(多重映射)——和映射(map)類似,然而其中的鍵值不要求必須是惟一的(便可以有重複)。
8.遊標是指針,但不只僅是指針。遊標和指針很像,功能很像指針,可是實際上,遊標是經過重載一元的」*」和」->」來從容器中間接地返回一個值。
9.iterator——對於除了vector之外的其餘任何容器,你能夠經過這種遊標在一次操做中在容器中朝向前的方向走一步。這意味着對於這種遊標你只能使用「++」操做符。而不能使用「--」或「+=」操做符。而對於vector這一種容器,你可使用「+=」、「—」、「++」、「-=」中的任何一種操做符和「<」、「<=」、「>」、「>=」、「==」、「!=」等比較運算符。
10.除了類型和值外,模板含有其餘的參數。你能夠傳遞一個回調函數(一般所說的聲明「predicate」——這是帶有一個參數的函數返回一個布爾值)。例如,若是你想自動創建一個集合,集合中的元素按升序排列,你能夠用簡明的方法創建一個set類:
set <int, greater<int> > set1

greater 是另外一個模板函數(範型函數),當值放置在容器中後,它用來爲這些值排序。若是你想按降序排列這些值,你能夠這樣寫:數組

set <int, less<int> > set1安全

11.vector中reserve只是預先劃分一塊內存給vector使用,主要是爲了提升效率:避免在不斷push_back的過程當中,因爲容量變更致使的從新分配!less

若是沒有的話,push_back的以後,當內存不夠了,就會有內存的從新分配和元素的拷貝。這是絕對很低效的。函數

若是 vector 的容量不夠了,它會
1. 從新分配更多的空間(通常是增長 N/2,N爲原容量)
2. 將現有vector中的數據逐個拷貝到新空間
3. 釋放舊空間中的全部元素
4. vector 指向新空間性能

相關文章
相關標籤/搜索