關聯式容器 map和multimap

2021-10-05 19:27:17 字數 3482 閱讀 6791

map的特性是,所有元素都會根據元素的鍵值自動被排序。map的所有元素都是pair,同時擁有實值(value)和鍵值(key)。pair的第一元素被視為鍵值,第二元素被視為實值。map不允許兩個元素擁有相同的鍵值。

我們不能通過map的迭代器修改map的鍵值,但是可以通過迭代器修改map的實值,因為紅黑樹的底層只提供了插入和刪除操作的自平衡,並沒有提供這種修改鍵值的自平衡,所以是不能通過迭代器修改鍵值的。   

map擁有list相同的某些性質:當客戶端對她進行元素新增操作或刪除操作的時候,操作之前的所有迭代器,在操作完成之後都依然有效。當然,被刪除的那個元素的迭代器必然是個例外。

標準的stl map 以紅黑樹作為底層的實現機制。

map的部分原始碼如下:

template , typename alloc = alloc>

//compare預設的情況使用遞增排序

class map

public:

bool operator()(const value_type& x, const value_type& y) const

};private:

typedef rb_tree, key_compare, alloc> rep_type;

rep_type t;//採用紅黑樹來實現map

public:

typedef typename rep_type::pointer pointer;

typedef typename rep_type::const_pointer const_pointer;

typedef typename rep_type::reference reference;

typedef typename rep_type::const_reference const_reference;

typedef typename rep_type::iterator iterator;

//注意上一行iterator並不像set一樣是紅黑樹的const_iterator,因為map允許通過迭代器修改實值

typedef typename rep_type::const_iterator const_iterator;

typedef typename rep_type::reverse_iterator reverse_iterator;

typedef typename rep_type::const_reverse_iterator const_reverse_iterator;

typedef typename rep_type::size_type size_type;

typedef typename rep_type::difference_type difference_type;

//下面幾個是map的建構函式,注意,map一定使用rb-tree的insert_unique()而非insert_equal()

//multimap才使用紅黑樹的insert_equal(),因為map不允許相同鍵值存在,而multimap允許

mqp():t(compare()){}

templatemap(inputiterator first, inputiterator last):t(compare())

templatemap(inputiterator first, inputiterator last, const compare& comp):t(comp)

map(const set& x):t(x.t){}

//賦值運算子

map& operator=(const set& x)

//下面的操作,紅黑樹已經提供,map只要呼叫即可

iterator begin() const //公升序排序時指向最xiao節點

iterator end() const //注意這個指向的是樹的header,頭結點的父節點(小技巧)

reverse_iterator rbegin() const //公升序排序時指向最da節點

reverse_iterator rend() const

bool empty() const

size_type size() const

t& operator(const key_type& k)

//注意下面insert函式返回值的型別

typedef pairpair_iterator_bool;

pairinsert(const value_type& x)

template void insert(inputiterator first, inputiterator last)

void erase(iterator position)

void erase(iterator first, iterator last)

size_type erase(const key_type& x)

}

map所提供的函式簡介:

這個函式底部呼叫的是insert_unique,返回的是乙個pair,pair的第乙個元素是插入的節點的迭代器,第二個元素是是否插入成功。注意map的value_type是乙個pair

begin和end是正向迭代器,其他的兩個是反向迭代器。假設紅黑樹是遞增的(左子樹的節點key < 根節點key < 右子樹的節點key),這是begin()返回最小元素的迭代器而rbegin()返回最大元素的迭代器。end()和rend()都是header節點的迭代器。(header是stl實現紅黑樹時的小技巧,header的父親指標指向root,header的左指標指向以root為根節點的最小元素,header的右指標指向以root為根節點的最大元素,root的父節點指向header)

這個函式的引數盛放是插入元素的容器的迭代器的開始位置和結束位置,注意返回值是void。注意容器裡面放的應該是pair

函式引數是要刪除的元素的迭代器

函式第乙個引數是要刪除的元素段的key最小元素的迭代器,第二個引數是要刪除元素段的key最大元素的迭代器

函式引數是刪除元素的key值

返回x的迭代器

返回節點key值為x的節點個數       

注意函式的返回值是引用,可以使用mymap[key]的方式讀取,key所對應的value。並且可以使用mymap[key] = myvalue的方式進行插入(注意運算子底層是呼叫的insert函式,並且返回的是引用,所以允許通過這種方式進行賦值)。

multimap的特性及用法與map完全相同,唯一的差別在於multimap允許鍵值重複,因此它的插入操作採用的紅黑樹的insert_equal()而不是insert_unique()。注意insert_unique的返回值是pair前面已經介紹了,insert_equal的返回值是插入節點的iterator,注意使用下面函式和map返回值的區別:

//返回值和map不一樣,map中的value_type是pair

iterator insert(const value_type& x)

關聯式容器 map

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

map關聯容器

資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值公升序進行輸出。輸入描述 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述 輸出合併後的鍵值對 多行 輸入例子 4 0 10 2 1 23 4 輸出例子 0 3 ...

關聯容器map

map是一種key value關聯的容器,第乙個稱為關鍵字,只能在map中出現一次,第二個稱為關鍵字的值。特點 map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。1 map是 鍵 值 對的...