關鍵字(key)無序
關聯容器
刷題過程中,有兩個步驟最為關鍵:
1、思路與解析,一道題能否找到解題的思路決定了能否做的出來,有明晰的思路就能夠腦海裡通過演算法與資料結構的知識去分解為每乙個小process,然後去解析實現直到最終結果,只有豐富的演算法經驗,才能在刷題過程中游刃有餘,逐個擊破!
2、**實現,有了思路我們該如何是程式設計實現?以c++為例,利用c++的stl,能充分縮短從底層資料結構構建基礎演算法的時間,從龐大的**量中解脫,快速實現題目要求!
通過大量閱讀文獻和**,下面將stl中常用容器原理與**實現總結一下。
1、底層實現原理
map內部實現了乙個紅黑樹,紅黑樹具有自動排序的功能,因此map內部的所有元素(pair儲存)都是有序的(map中的元素是按照二叉搜尋樹儲存的),紅黑樹的每乙個節點都代表著map的乙個元素。
map使用鍵值對的方式來儲存資料,鍵不能有重複的,值可以重複,系統會根據鍵來自動將資料排序
2、特點
優點:
缺點:
適用處:對於那些有順序要求的問題,用map會更高效一些
1、底層實現原理
unordered_map內部實現了乙個雜湊表(也叫雜湊表,通過把關鍵碼值對映到hash表中乙個位置來訪問記錄
2、特點
優點:因為內部實現了雜湊表,因此其查詢速度非常的快,實現**的效率較高
缺點:雜湊表的建立比較耗費時間,所以記憶體占有率高
適用處:對於查詢問題,unordered_map會更加高效一些,因此遇到查詢問題,常會考慮一下用unordered_map
map和unordered_map的差別和使用
關聯容器都支援普通容器的基本操作,不支援順序容器的位置相關的操作,如push_front或push_back。原因是關聯容器中的元素是根據關鍵字儲存的,這些操作對關聯容器是沒有意義的。而且,還不支援建構函式或插入操作這些接受乙個元素值和乙個數量值得操作
關聯容器的迭代器是雙向的
每個關聯容器都定義了乙個預設的建構函式,它建立乙個指定型別的空容器。我們也可以將關聯容器初始化為另乙個同型別容器的拷貝,或是從乙個範圍來初始化關聯容器,只要這些值可以轉換為容器所需的型別就可以。
multimap或multiset允許多個元素具有相同的關鍵字。
插入元素:
c.insert(v) v是乙個value_type型別的物件;args用來構造乙個元素
c.emplace(args) 對於map和set, 只有當元素的關鍵字不在c中時才能插入。函式返回乙個pair,包含乙個迭代器。指向具有關鍵字的元素,以及乙個指示插入是否成功的bool值。對於multimap和multiset,總會插入給定的元素,並返回乙個指向新元素的迭代器
c.insert(b,e) b,e是迭代器,表示乙個c::value_type型別值得範圍;il是這種值得初始化列表。函式返回void
c.insert(il); 對於set和map,只有插入關鍵字不存在的。對於multimap和multiset,則會插入範圍中的每個元素
c.insert(p,v) 類似insert(v) (或emplace(args))但用p指出從**開始搜尋新元素應該儲存的位置。返回迭代器,指向給定原件字的元素
c.emplace(p,args)
刪除操作:
c.erase(k) 從c中刪除每個關鍵字為k的元素,返回乙個size_type值。指出刪除元素的數量,若果返回0表示要刪除的元素麼有在容器中
c.erase§ 從c中刪除迭代器p指定的元素。p必須指向c中真是元素,不能等於c.end()。返回乙個指向p之後的元素的迭代器,若p指向c中的尾元素 ,則返回c.end()
c.erase(b,e) 刪除迭代器b和e所表示的範圍中的元素,返回e
在乙個關聯容器中查詢元素的操作:
lower_bound和upper_bound不適合於無序容器。
下標和at操作只適用於非const的map和unordered_map
c.find(k) 返回乙個迭代器,指向第乙個關鍵字為k的元素,若k不在容器中,則返回尾後迭代器
c.count(k) 返回關鍵字等於k的元素的數量。對於不允許重複關鍵字的容器,返回值永遠是0或1
c.lower_bound(k) 返回乙個迭代器,指向第乙個關鍵字不小於k的元素
c.upper_bound(k) 返回乙個迭代器,指向第乙個關鍵字大於k的元素
c.equal_range(k) 返回乙個迭代器pair, 表示關鍵字等於k的元素的範圍。若k不存在,pair的兩個成員等於c.end()
c++順序容器知識總結
《c++ primer》讀書筆記第十一章-2-關聯容器操作
map和unordered_map的差別和使用
STL常用容器對比
stl的常用容器大致有以下8個 vector是一種動態陣列,在記憶體中具有連續的儲存空間,支援快速隨機訪問。由於具有連續的儲存空間,所以在插入和刪除操作方面,效率比較慢。vector有多個建構函式,預設的建構函式是構造乙個初始長度為0的記憶體空間,且分配的記憶體空間是以2的倍數動態增長的,在push...
STL常用容器總結
include 標頭檔案 queue q 定義 q.push x 入隊 q.pop 出隊 q.empty 判空 q.size 佇列元素個數 q.front 隊首元素值 q.back 隊尾元素值 include 標頭檔案 stack s 定義 s.push x 入棧 s.pop 出棧 s.empty ...
STL常用容器 6 list容器
5 案例 鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相較於vector的連續線...