STL常用容器與演算法

2021-09-19 11:27:41 字數 2441 閱讀 5946

stl共有六大元件

1、容器。2、演算法。3、迭代器。4、仿函式。6、介面卡。

stl容器的實現原理

stl來管理資料十分方便,省去了我們自己構建資料結構的時間.其實,stl的實現也是基於我們常見的資料結構.

序列式容器:

vector-陣列,元素不夠時再重新分配記憶體,拷貝原來陣列的元素到新分配的陣列中。

list-單鏈表。

deque-分配**控制器map(並非map容器),map記錄著一系列的固定長度的陣列的位址.記住這個map僅僅儲存的是陣列的位址,真正的資料在陣列中存放著.deque先從map**的位置(因為雙向佇列,前後都可以插入元素)找到乙個陣列位址,向該陣列中放入資料,陣列不夠時繼續在map中找空閒的陣列來存資料。當map也不夠時重新分配記憶體當作新的map,把原來map中的內容copy的新map中。所以使用deque的複雜度要大於vector,盡量使用vector。

stack-基於deque。

queue-基於deque。

heap-完全二叉樹,使用最大堆排序,以陣列(vector)的形式存放。

priority_queue-基於heap。

slist-雙向鍊錶。

關聯式容器:

set,map,multiset,multimap-基於紅黑樹(rb-tree),一種加上了額外平衡條件的二叉搜尋樹。

hash table-雜湊表。將待存資料的key經過對映函式變成乙個陣列(一般是vector)的索引,例如:資料的key%陣列的大小=陣列的索引(一般文字通過演算法也可以轉換為數字),然後將資料當作此索引的陣列元素。有些資料的key經過演算法的轉換可能是同乙個陣列的索引值(碰撞問題,可以用線性探測,二次探測來解決),stl是用開鏈的方法來解決的,每乙個陣列的元素維護乙個list,他把相同索引值的資料存入乙個list,這樣當list比較短時執行刪除,插入,搜尋等演算法比較快。

hash_map,hash_set,hash_multiset,hash_multimap-基於hash table。

綜上所述大家應該知道了什麼情況下該使用哪乙個stl容器更合適,可以在適當時候避免使用一些影響效率的stl容器.

這裡我們不涉及容器的基本操作之類,只是要討論一下各個容器其各自的特點stl中的常用容器包括:順序性容器(vector、deque、list)、關聯容器(map、set)、容器介面卡(queue、stac)

stl是c/c++開發中乙個非常重要的模板,而其中定義的各種容器也是非常方便我們大家使用。下面,我們就**某些常用的容器。這裡我們不涉及容器的基本操作之類,只是要討論一下各個容器其各自的特點。stl中的常用容器包括:順序性容器(vector、deque、list)、關聯容器(map、set)、容器介面卡(queue、stac)。

map簡介

map是stl的乙個關聯容器(associative container)之一,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map**現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的。 

乙個map是乙個鍵值對序列,

即(key ,value)對。它提供基於key的快速檢索能力,在乙個map中key值是唯一的。map提供雙向迭代器,即有從前往後的(iterator),也有從後往前的(reverse_iterator)。

map中key值是唯一 

例子:如果已存在乙個鍵值對(編號,使用者名稱):(1001,"jack"),而我們還想插入乙個鍵值對(1001,"mike") 執行時會報錯(不是報錯,準確的說是,返回插入不成功!)。而我們又的確想這樣做,即乙個鍵對應多個值,幸運的是multimap可是實現這個功能。

map中的型別定義

// map::begin/end

#include #include int main ()

//a => 200

z => 300

在實際使用過程中,到底選擇這幾種容器中的哪乙個,應該根據遵循以下原則:

1、如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用vector;

2、如果需要大量的插入和刪除元素,不關心隨機訪問的效率,使用list;

3、如果需要隨機訪問,並且關心兩端資料的插入和刪除效率,使用deque;

4、如果打算儲存資料字典,並且要求方便地根據key找到value,一對一的情況使用map,一對多的情況使用multimap;

5、如果打算查詢乙個元素是否存在於某集合中,唯一存在的情況使用set,不唯一存在的情況使用multiset。

演算法設計與分析 常用的STL容器(二)

stl容器很多,每乙個容器就是乙個類模板 順序容器 介面卡容器 關聯容器 可參考演算法設計與分析 常用的stl容器 一 演算法設計與分析 常用的stl容器 三 關聯容器中的每個元素有乙個key 關鍵字 通過key來儲存和讀取元素,這些關鍵字可能與元素在容器中的位置無關,所以關聯容器不提供順序容器中的...

STL常用容器對比

stl的常用容器大致有以下8個 vector是一種動態陣列,在記憶體中具有連續的儲存空間,支援快速隨機訪問。由於具有連續的儲存空間,所以在插入和刪除操作方面,效率比較慢。vector有多個建構函式,預設的建構函式是構造乙個初始長度為0的記憶體空間,且分配的記憶體空間是以2的倍數動態增長的,在push...

STL常用容器解析

關鍵字 key 無序 關聯容器 刷題過程中,有兩個步驟最為關鍵 1 思路與解析,一道題能否找到解題的思路決定了能否做的出來,有明晰的思路就能夠腦海裡通過演算法與資料結構的知識去分解為每乙個小process,然後去解析實現直到最終結果,只有豐富的演算法經驗,才能在刷題過程中游刃有餘,逐個擊破!2 實現...