第10章 關聯容器

2021-06-18 00:03:06 字數 2319 閱讀 1730

關聯容器支援通過鍵來高效地查詢和讀取元素。基本關聯容器:map和set。set僅包含乙個鍵。multimap和multiset支援同乙個鍵多次出現在容器中。

pair型別,定義在utility標頭檔案中。建立和初始化如:pairp1(v1,v2);或make_pair(v1,v2)賦給pair型別的變數。

對於pair型別,也可考慮typedef簡化其宣告:如,typedef pairauthor;

對於pair類,可以直接訪問其資料成員:其成員都是公有的。

在使用關聯容器時,它的鍵不但有乙個型別,而且還有乙個相關的比較函式。預設情況下,標準庫使用鍵型別定義的《操作符來實現鍵的比較。對於鍵型別,唯一的約束就是必須支援

<

操作符。

map::value_type是儲存元素的鍵以及值的pair型別,而且鍵為

用下標訪問不存在的元素將導致在

map容器中新增乙個新的元素,它的鍵即為該下標值,如果沒給該元素賦值,則值進行預設初始化,如

int則初始化為

0。mapint>word;

word["hello"]++;

pair

int> word2("hello",33);

word.insert(word2);//這邊

word2

沒有插入成功,

word

的hello

值還是1。即在插入時,如果鍵在m中已經存在,則保持m不變。該函式返回乙個pair型別物件,包含指向鍵為e.first的元素的map迭代器,以及乙個bool型別的物件,表示是否插入了該元素,如:pair::iterator, bool> ret=函式返回。++ret.first->second實現該值遞增,->優先順序高於++。

還有如:insert(beg,end);beg和end是標記元素範圍的迭代器,即插入該範圍內的所有元素,遵循前閉後開原則。

m.count(k):返回m中k的出現次數。它對於map鍵來說,0,1可以反應乙個鍵是否存在。

m.find(k):如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器。如用:find函式!= 容器.end()來判斷。

map容器的erase操作返回void。而順序容器的erase操作則返回乙個迭代器,指向被刪除元素後面的元素。

m.erase(b,e)從m中刪除一段範圍內的元素,遵循前閉後開原則。

map同樣提供begin和end運算。

以一段範圍的元素初始化set物件,或在set物件中插入一組元素時,對於每個鍵,事實上都只新增了乙個元素。

set中新增元素:(1)insert乙個元素;(2)呼叫insert時,提供一對迭代器實參,插入其標記範圍內所有的元素。

set中獲取元素:(1)find運算,找到返回對應元素的迭代器,否則為end()迭代器。(2)count運算,返回1或0。

set的鍵也是

const

,不能通過找到的迭代器修改鍵值。

multimap不支援下標運算(顯然,某個鍵對應多個值),其餘與map操作相同。

帶有乙個引數的erase版本將刪除擁有該鍵的所有元素,並返回刪除元素的個數。而帶有乙個或一對迭代器引數的版本只刪除指定的元素,並返回

void

型別。在multimap中,同乙個鍵所關聯的元素必然相鄰存放。

案例:假設有作者與書名對映,希望找到並輸出某個作者寫的所有書的書名。方法一,使用find和count操作。首先呼叫count確定某作者所寫的書籍數目,然後呼叫find獲得指向第乙個該鍵所關聯的元素迭代器。方法二,用lower_bound(k)(返回乙個迭代器,指向鍵不小於k的第乙個元素)和upper_bound(k)(返回乙個迭代器,指向鍵大於k的第乙個元素)。如果該鍵沒有關聯的元素,則lower_bound和upper_bound返回相同的迭代器,都指向同乙個元素或同時指向multimap的超出末端位置。它們都指向在保持容器元素順序的前提下,該鍵應被插入的位置。equal_range(k)返回乙個迭代器的pair物件,它的first成員等價於m.lower_bound(k),second成員等價於m.upper_bound(k)。

設計程式的乙個良好習慣是首先將程式所涉及的操作列出來。明確需要提供的操作,有助於建立需要的資料結構和實現這些行為。(看似常識,有時卻不會去執行···)

問題:查詢給出的單詞所在的行號及每行內容

方法:(1)使用vector型別的物件儲存整個檔案的副本,檔案的每行是該物件的乙個元素。在輸出某一行時,只需以行號為下標獲取該行所在的元素即可。(2)將每個單詞所在的行號儲存在乙個set容器物件中。(3)使用乙個map容器將

每個單詞與乙個

set容器物件關聯起來,該set容器物件記錄此單詞所在的行號。具體就是對每行的每個單詞,用map[word].insert(行號);即可。

第10章 關聯容器 1

關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative container 支援通過鍵來高效地查詢和讀取元素。map的元素以鍵 值 key value 對的形式組織 鍵用作元素在map中的索引,...

複習小記 第10章 關聯容器

1.使用下標訪問map中不存在的元素,將會使map容器中被加入乙個新的pair,他的鍵即為該下標。3.使用下標操作符可以讀取map容器中的值,但是該操作存在乙個很危險的 若作為下標的鍵值不在該map容器中,那麼此操作會插入乙個具有該鍵的新元素。map容器提供了兩個操作用於檢查某個鍵是否存在而不會插入...

第11章 關聯容器

關聯容器型別 map關聯陣列 儲存關鍵字 值對 set關鍵字即值,即只儲存關鍵字的容器 multimap 關鍵字可以重複出現的map multiset 關鍵字可以重複出現的set unordered map 用雜湊函式組織的map unordered set 用雜湊函式組織的set unordere...