STL原始碼中map和set中key值不能修改的實現

2021-06-26 11:15:56 字數 962 閱讀 9266

最近正好剛剛看完,《stl原始碼剖析》這本書的map和set的原始碼部分。但是看完之後又突然發現,之前怎麼沒有注意到map和set容器中key不能修改是怎麼實現的。故,特此整理如下。

set中具體怎麼實現的,看原始碼是最清楚的,下面就是set的部分原始碼:

class set 

從其中的set的迭代器的定義,我們可以看出set的iterator定義為rep_type::const_iterator,這樣獲取的set的迭代器預設就是常量迭代器,自然就不能去修改set中的key值。

同樣,也是先看看map中有關的原始碼,然後結合原始碼分析,部分原始碼如下:

class map

雖然map中的key值也是不能修改的,但是其中實值是可以修改的,所以map的迭代器不能是const_iterator,由上面的原始碼也可以看出。那麼key值不允許修改是怎麼實現的?map底層實現是通過紅黑樹實現的,其中紅黑樹的定義為

typedef rb_tree, key_compare, alloc> rep_type;  // rb_tree的定義

可以看到其中紅黑樹儲存值的型別是value_type,而value_type定義是:

typedef pairvalue_type;   //value_type的定義

對於乙個map容器,每次插入、刪除或者查詢返回的迭代器,其指向的紅黑樹中node節點,對其iterator->,解出的值的型別是value_type,這是乙個pair的包裝類,這個,我們定義了它的key為const key,而其值的型別為t,這樣對於每次返回的迭代器,我們就可以實現,其中key為const型別不能修改,對於實值不是const,可以修改。

這樣就實現了對其的key的限制和實值的開放修改。

STL原始碼分析set

include include using namespace std int main set iset ia,ia 5 cout size iset.size endl cout 3 count iset.count 3 endl iset.insert 3 cout size iset.siz...

STL 中map 和 set 的知識點總結

stl中的容器有順序容器 vector,list,deque 關聯容器 map,set 還有一些其他容器。根據不同的場合選擇不同的容器,會有意想不到的收穫。set是單詞set 集合 的意思 map和set內部的元素不可以重複,這一點不同於multimap和multiset。map 和 set使用相同...

STL中map和priority queue的應用

基本的知識就不再講了,只列下用map做的題目 題1 poj 1002 487 3279 這個題目煩的死,tle了n次,只是因為我用g 提交的,好啦,要注意的就是把陣列開大點,和用c語言輸入,最後如果沒有重複的 號碼輸出 no duplicates.include include include in...