STL容器及簡單使用總結

2021-10-04 00:05:13 字數 2490 閱讀 5919

stl ( standard template library) 的目的是標準化元件,這樣就不用重新開發,可以使用現成的元件。stl是c++的一部分,因此不用安裝額外的庫檔案。

stl是一種泛型程式設計。物件導向程式設計關注的是程式設計的資料方面,而泛型程式設計關注的是演算法。(不是很懂)

stl主要包括容器(containers)和演算法(algorithms),以下是自己對幾個主要的stl容器的理解。

stl容器

vector

向量,連續的空間儲存,可以使用操作符。乙個動態分配儲存空間的容器,在插入新的元素後,會自動重分配(擴充套件)空間。

可以快速的在末尾插入元素,但是在序列中間的插入/刪除元素要慢,而且如果一開始分配的空間不夠的話,有乙個重新分配更大空間,就會產生拷貝的效能開銷。

list

雙向鍊錶,每個元素間用鍊錶相連,可以非連續空間儲存。不能使用操作符。

訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素分配空間,所以不存在空間不夠,重新分配的情況。所以list更適合 需要在任意位置頻繁插入/刪除操作的情況。

queue

單向佇列,也就是乙個先進先出的fifo,不能使用操作符。不能訪問中間元素,只能訪問首尾的元素。

deque

雙向佇列,可以使用操作符。

queue是單向push,單向pop;而deque是雙向(既可以從front方向,也可以從back方向) 都可以push和pop。

小片的連續,小片間用鍊錶相連,實際上內部有乙個map的指標。

快速的在開始和末尾插入元素;隨機的插入/ 刪除元素要慢;空間的重新分配要比vector快。

set集合,關聯容器,只有key值,元素唯一,不允許重複。

內部用一棵平衡樹結構來儲存,每次insert都會重新進行排序,查詢也比較快

參考 《c ++ primer》p378 關鍵字型別要求,預設情況下,標準庫使用關鍵字型別的< 運算子來比較兩個關鍵字。對於set 和map,是按照這個 < 關係來進行排序的。

我們不能直接定義乙個 自定義型別的set或map,因為其沒有 < 運算子,需要自己對自定義型別規定乙個 < 運算子,以後有機會再專門討論這個話題。

mutilset

元素允許重複

map關聯容器,一對一的對映的結合,key不能重複。

可以通過insert(std::pair)插入元素,或者直接 [key] =value進行插入。

可以直接使用[key]得到這個元素的value值。

對於set和map,要習慣使用迭代器iterator。

multimap

key值可以重複

c語音中的陣列也是連續儲存,陣列和vector的主要不同點在於vector可以隨時增加長度,但陣列的長度是在定義時就確定好了的。

vector

陣列可以用size獲取vector的長度

不可以獲取,在定義時就已經確定了長度

長度不固定,可以隨時增加

長度固定,在定義是就不可以更改

可以在末尾增加vector的元素(用push_back)

不能增加在長度以外的長度

不能確定長度,必須在定義時定義乙個很大的空間留給陣列,造成記憶體的浪費

可以確定長度,節約空間

可以用size獲取vector的長度

不可以獲取,在定義時就已經確定了長度

vector、list、queue、deque都屬於順序容器,那怎麼來選擇用哪一種容器呢?

下面是選擇順序容器型別的一些準則

如果我們需要隨機訪問乙個容器,則vector要比list好得多 。

如果我們已知要儲存元素的個數,則vector 又是乙個比list好的選擇。

如果我們需要的不只是在容器兩端插入和刪除元素,則list顯然要比vector好 。

除非我們需要在容器首部插入和刪除元素,否則vector要比deque好。

如果只在容易的首部和尾部插入資料元素,則選擇deque。

需要注意的是,在使用set和map時,因為key是唯一的,如果你insert了相同key值的元素,則會覆蓋掉之前的元素(map的value值變成新插入的)。所以,為了避免不必要的debug工作,養成好的編碼習慣:

在往set或map中插入新元素之前,先check是否已經有相同key的元素了,如果有,就assert。

std::map::iterator it = m_map.find( key_element );

assert(it ==m_map.end());

m_map[key_element] = value ;

在準備erase set或map中的元素時,先check是否存在這個key的元素。

std::map::iterator it = m_map.find( key_element );

assert(it !=m_map.end());

m_map.erase(it);

同時,在使用stl容器的時候,一定要特別注意,有insert就需要有erase,否則記憶體會爆掉的。

stl容器簡單總結

標準容器類 說明順序性容器 vector 從後面快速的插入與刪除,直接訪問任何元素 deque 從前面或後面快速的插入與刪除,直接訪問任何元素 list 雙鏈表,從任何地方快速插入與刪除 關聯容器 set快速查詢,不允許重複值 multiset 快速查詢,允許重複值 map一對多對映,基於關鍵字快速...

STL 容器特點簡單總結

stl的容器可以分為以下幾個大類 一 序列容器,有vector,list,deque,string.二 關聯容器,有set,multiset,map,mulmap,hash set,hash map,hash multiset,hash multimap 三 其他的雜項 stack,queue,va...

STL容器使用總結

include include include include include include 優先佇列,大的元素自動排在隊頭 include key唯一,重複會覆蓋 多重對映,允許有重複的key include 集合 相當於沒有value的對映using namespace std void pu...