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...