關聯式容器map multimap

2021-07-11 01:06:56 字數 1650 閱讀 5441

和set相比,map同時擁有實值(value)和鍵值(key),其每乙個元素都是pair,pair的第乙個元素是鍵值,第二個元素是實值。map和multimap的區別在於,map不允許兩個元素擁有相同的鍵值,而multimap允許存在重複的鍵值。

pair

pair定義如下:1 23

4567

89

template<classt1,classt2>

structpair

迭代器

map和set的底層實現都是很rb-tree,其迭代器特點和set一致。

我們可以通過map的迭代器來改變元素的實值。

1、如果想要修改元素的鍵值,不行。任意改變元素的鍵值會嚴重破壞map組織。但如果像修改元素的實值,可以。因為map元素的實值並不影響map元素的排列規則。因此,map iterator既不是一種constant iterators也不是一種mutable iterators

2、map擁有與list相同的而某些性質:當使用者對它進行元素新增操作(insert)或者刪除(erase)時,操作之前的所有迭代器,在操作完成之後都依然有效。當然,被刪除的那個迭代器必然是個例外。

3、由於rb-tree是一種平衡二叉搜尋樹,自動排序的效果很好,所以標準stl map即以rb-tree為底層實現機制。又由於map所開放的各種操作介面,rb-tree也都提供了,所以幾乎所有的map操作行為,都只是轉呼叫rb-tree的操作行為而已。

4、針對

map的insert函式1

2

3

4

pair insert(constvalue_type &x)

此式將工作轉給底層的rb-tree的insert_unique()去執行。

要注意的是,其返回值是乙個pair,由乙個迭代器和乙個bool值組成,後者表示插入是否成功,成功的話前者即指向被插入的那個元素。

5、map的subscript(下標)操作符,用法有兩種。可能作為左值運算子(內容可被修改),也可能作為右值運用(內容不可被修改)。例如:

1

2

3

4

map simap;//以string為鍵值,int為實值

simap[string("oyjb")] = 1;//以左值運用

...

intnumber = simap = simap[string("oyjb")];//右值運用

左值或者右值都適用的關鍵在於,返回值採用by reference傳遞形式。

但是無論如何,subscript操作符的工作,都得先根據鍵值找出其實值,再作打算。

關聯式容器

關聯式容器是用來儲存資料的,與序列式容器不同的是,其儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。鍵值對 用來表示具有一一對應關係的結構,該結構中一般只含兩個成員變數key和value,key代表鍵值,value表示與key對應的資訊。比如 現在要建立乙個英漢互譯的字典,那該字典中必然有英...

C 容器 關聯式容器

由於multimap和map相差不大,所以基本以map做練習 集合 map 是一種包含已 排序 公升序 物件的關聯 容器。map multimap會根據待定的排序準則,自動將元素排序。兩者不同在於前者不允許元素重複,而後者允許。集合元素的第乙個引數是key,第二個元素當做value,元素的順序與ke...

關聯式容器 map

map的特性是,所有元素都會根據元素的鍵值自動被排序。map的所有元素的型別都是pair,而map的底層就是一顆紅黑樹。它不同set的是,它既有是鍵值 key 排序根據key排序,鍵值保持唯一性,它還具有實值 value pair既pair的first為key,second為value。我們不能修改...