C STL原始碼分析 set和multiset

2021-10-03 02:38:56 字數 2779 閱讀 4429

【侯捷-sl體系結構核心分析-set和multiset探索】

stl中assosiated container 比如 set 和 multiset 底層都是由紅黑樹作為支撐實現,所以在了解他們之前,有必要先來了解一下紅黑樹。

template

<

class

_traits

>

class

_tree

:public _tree_comp_alloc<_traits>

注:stl中紅黑樹的定義在file://…/xtree檔案中

可以看到,要定義乙個紅黑樹時,需要乙個模板引數_traits,那麼_traits是什麼呢?

為了知道_traits是什麼,可以參考set中對_traits的定義。set的定義如下:

template

<

class

_kty

,class

_pr= less<_kty>

,class

_alloc

= allocator<_kty>>

class

set:

public _tree<_tset_traits _pr _alloc>

false

>>

可以看到,set容器繼承了_tree,傳給_tree的模板引數是_tset_traits<_kty _pr _alloc false>,那_tset_traits又是什麼呢?

template

<

class

_kty

,// key/value type

class

_pr,

// comparator predicate type

class

_alloc

,// actual allocator type (should be value allocator)

bool _mfl>

// true if multiple equivalent keys are permitted

class

_tset_traits

;using value_compare = key_compare;

static

const _kty&

_kfn

(const value_type& _val)

};

可以看到,_traits從他的名稱也可以看出,它類似乙個萃取器,將符合特定容器特徵的引數轉換為紅黑樹_tree所需的內容。個人認為也類似於介面。 根據 set 的_tset_traits,可以得出,紅黑樹中_tree模板引數需要指定以下內容:

key和value的關係如下:

那麼,對於set的來說,它的 key = value,且不允許插入相同的元素。所以才有了以上版本的_tset_traits。

基於以上分析,我們可以利用set的_traits類,寫出如下**,測試紅黑樹:

#include

#include

#include

using

namespace std;

intmain

(int agrc,

char

* ar**)

return0;

}

結果如下:

the size of rbtree:

7has find number 12?12

the sorted numbers :13

56912

34

可以看到

再看一遍set容器定義:

template

<

class

_kty

,class

_pr= less<_kty>

,class

_alloc

= allocator<_kty>>

class

set:

public _tree<_tset_traits _pr _alloc>

false

>>

可以看到set繼承了_tree,set的所有操作,都是轉而呼叫頂層紅黑樹_tree的操作,從這種意義上來說,set也未嘗不可以稱為container adapter。

也可以看到,set將_tset_traits 的 _mfl 引數設定為false,即證明了set不能夠插入相同的元素。

multiset的定義如下:

template

<

class

_kty

,class

_pr= less<_kty>

,class

_alloc

= allocator<_kty>>

class

multiset

:public _tree<_tset_traits _pr _alloc>

true

>>

注:與set容器定義在同乙個檔案中。

可以看出,multiset與set容器類似,區別只在於將_tset_traits 的 _mfl 引數設定為了true,即multiset允許插入相同的元素。

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...

C STL原始碼分析 演算法(一)

侯捷 sl體系結構核心分析 演算法 目錄 accumulate for each replace,replace if,replace copy 原始碼 accumulate 的原始碼如下。template class init class ty,class fn nodiscard inline ...

關於Set的原始碼分析

set介面繼承collection介面,裡面的方法在collection中都存在 set的幾個主要實現類為 hashset,treeset hashset原始碼 hashset的繼承關係 public class hashsetextends abstractsetimplements set,cl...