和set相比,map同時擁有實值(value)和鍵值(key),其每乙個元素都是pair,pair的第乙個元素是鍵值,第二個元素是實值。map和multimap的區別在於,map不允許兩個元素擁有相同的鍵值,而multimap允許存在重複的鍵值。
pair
pair定義如下:1 23
4567
89
template
<
class
t1,
class
t2>
struct
pair
迭代器
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(
const
value_type &x)
此式將工作轉給底層的rb-tree的insert_unique()去執行。
要注意的是,其返回值是乙個pair,由乙個迭代器和乙個bool值組成,後者表示插入是否成功,成功的話前者即指向被插入的那個元素。
5、map的subscript(下標)操作符,用法有兩種。可能作為左值運算子(內容可被修改),也可能作為右值運用(內容不可被修改)。例如:
1
2
3
4
map simap;
//以string為鍵值,int為實值
simap[string(
"oyjb"
)] = 1;
//以左值運用
...
int
number = 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。我們不能修改...