STL原始碼閱讀 七

2021-07-16 06:06:19 字數 1189 閱讀 2671

set使用紅黑樹實現,每個鍵值都不相同,且按序儲存。注意operator=(即_rb_tree的實現)先銷毀賦值號左邊的set,

然後將右邊的set拷貝給左邊的set, 而不是原值替換。

set的所有函式都是用_rb_tree的函式實現的,相當於_rb_tree的乙個包裝類。

multiset使用紅黑樹實現,鍵值可重複,按序儲存。相當於_rb_tree的乙個包裝類。

使用紅黑樹實現,鍵值不可重複,按鍵值順序排序。相當於_rb_tree的乙個包裝類。

注意:巢狀類value_compare實際比較的還是鍵值。

使用紅黑樹實現,和map基本相同,只不過是可以重複相同的鍵值。

list相比,實現方式不同,list通過雙向環狀鍊錶實現,而slist使用單向鍊錶實現。另外,slist

迭代器型別是前向迭代器,和list的雙向迭代器相比更加節省記憶體。不足之處是slist不支援元素的快速隨機訪問。

// slist結點

struct _slist_node_base

;template

struct _slist_node : public _slist_node_base

;// slist記憶體分配器

// 在建立鍊錶時,多分配乙個結點(_m_head)用於指向整個鍊錶。

// slist迭代器,前向迭代器,只有++這乙個單步方向

// 歸併排序

template

void slist<_tp,_alloc>::sort()

__carry.swap(__counter[__i]);

if (__i == __fill)

++__fill;

}for (int __i = 1; __i < __fill; ++__i)

__counter[__i].merge(__counter[__i-1]);

this->swap(__counter[__fill-1]);

}}// 其它函式看看參考手冊,了解其功能就能知道其怎麼實現的了,沒什麼好說的了。

sgi stl

cppreference.com

STL 原始碼閱讀

1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...

STL原始碼閱讀 二

vector的記憶體分配基類 template class vector alloc base vector alloc base的偏特化版本,不需要儲存記憶體分配器 template class vector alloc base tp,allocator,true template struct...

STL原始碼閱讀 八

字串的雜湊函式 f s 5 f s 1 s,當len s 1,則f s s 其中s是指向字串的指標。示例 inline size t stl hash string const char s template struct hash sgi hash table碰撞檢測方法是鏈結法,雜湊表的每個槽都...