最近正好剛剛看完,《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...