www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > CPP開(kāi)發(fā)者
[導(dǎo)讀]↓推薦關(guān)注↓std::set/std::map(以下用std::map代表)是常用的關(guān)聯(lián)式容器,也是ADT(抽象數(shù)據(jù)類(lèi)型)。也就是說(shuō),其接口(不是OO意義下的interface)不僅規(guī)定了操作的功能,還規(guī)定了操作的復(fù)雜度(代價(jià)/cost)。例如set::insert(iterat...

推薦關(guān)注↓

select_card mp_profile_iframe" data-pluginname="mpprofile" data-id="MzAxMDM0MzQ4Mg==" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/DSU8cv1j3ibStMRcibJLd4TkNlt53KNZj0A2IicORH4REC4ics87icsx703M5giby2wuofz3dicMsHVcXDMXTM6t6VBQw/0?wx_fmt=png" data-nickname="開(kāi)源前哨" data-alias="osfront" data-signature="點(diǎn)擊獲取10萬(wàn) star的開(kāi)發(fā)資源庫(kù)。 日常分享熱門(mén)、有趣和實(shí)用的開(kāi)源項(xiàng)目~" data-from="0">

std::set/std::map (以下用 std::map 代表) 是常用的關(guān)聯(lián)式容器,也是 ADT(抽象數(shù)據(jù)類(lèi)型)。也就是說(shuō),其接口(不是 OO 意義下的 interface)不僅規(guī)定了操作的功能,還規(guī)定了操作的復(fù)雜度(代價(jià)/cost)。例如 set::insert(iterator first, iterator last) 在通常情況下是 O(N log N),N 是區(qū)間的長(zhǎng)度;但是如果 [first, last) 已經(jīng)排好序(在 key_compare 意義下),那么復(fù)雜度將會(huì)是 O(N)。

盡管 C 標(biāo)準(zhǔn)沒(méi)有強(qiáng)求 std::map 底層的數(shù)據(jù)結(jié)構(gòu),但是根據(jù)其規(guī)定的時(shí)間復(fù)雜度,現(xiàn)在所有的 STL 實(shí)現(xiàn)都采用平衡二叉樹(shù)來(lái)實(shí)現(xiàn) std::map,而且用的都是紅黑樹(shù)?!端惴▽?dǎo)論(第 2 版)》第 12、13 章介紹了二叉搜索樹(shù)和紅黑樹(shù)的原理、性質(zhì)、偽代碼,侯捷先生的《STL 源碼剖析》第 5 章詳細(xì)剖析了 SGI STL 的對(duì)應(yīng)實(shí)現(xiàn)。本文對(duì) STL 中紅黑樹(shù)(rb_tree)的實(shí)現(xiàn)問(wèn)了幾個(gè)稍微深入一點(diǎn)的問(wèn)題,并給出了我的理解。

本文剖析的是 G 4.7 自帶的這一份 STL 實(shí)現(xiàn)及其特定行為,與《STL 源碼剖析》的版本略有區(qū)別。為了便于閱讀,文中的變量名和 class 名都略有改寫(xiě)(例如 _Rb_tree_node 改為 rb_tree_node)。本文不談紅黑樹(shù)的平衡算法,在我看來(lái)這屬于“旁枝末節(jié)”(見(jiàn)陳碩《談一談網(wǎng)絡(luò)編程學(xué)習(xí)經(jīng)驗(yàn)》對(duì)此的定義),因此也就不關(guān)心節(jié)點(diǎn)的具體顏色了。

數(shù)據(jù)結(jié)構(gòu)回顧

先回顧一下數(shù)據(jù)結(jié)構(gòu)教材上講的二叉搜索樹(shù)的結(jié)構(gòu),節(jié)點(diǎn)(Node)一般有三個(gè)數(shù)據(jù)成員(left、right、data),樹(shù)(Tree)有一到兩個(gè)成員(root 和 node_count)。

用 Python 表示:
class?Node:
????def?\_\_init\_\_\(self,?data\):
????????self.left?=?None
????????self.right?=?None
????????self.data?=?data

class?Tree:
????def?\_\_init\_\_\(self\):
????????self.root?=?None
????????self.node\_count?=?0
而實(shí)際上 STL rb_tree 的結(jié)構(gòu)比這個(gè)要略微復(fù)雜一些,我整理的代碼見(jiàn) https://gist.github.com/4574621#file-tree-structure-cc ?。

節(jié)點(diǎn)

Node 有 5 個(gè)成員,除了 left、right、data,還有 color 和 parent。

C 實(shí)現(xiàn),位于bits/stl\_tree.h
/\*\*
?\*?Non-template?code
?\*\*/

enum?rb\_tree\_color?\{?kRed,?kBlack?\};

struct?rb\_tree\_node\_base
\{
??rb\_tree\_color???????color\_;
??rb\_tree\_node\_base\*??parent\_;
??rb\_tree\_node\_base\*??left\_;
??rb\_tree\_node\_base\*??right\_;
\};

/\*\*
?\*?template?code
?\*\*/

template\
struct?rb\_tree\_node?:?public?rb\_tree\_node\_base
\{
??Value?value\_field\_;
\};
見(jiàn)下圖。

node
color 的存在很好理解,紅黑樹(shù)每個(gè)節(jié)點(diǎn)非紅即黑,需要保存其顏色(顏色只需要 1-bit 數(shù)據(jù),一種節(jié)省內(nèi)存的優(yōu)化措施是把顏色嵌入到某個(gè)指針的最高位或最低位,Linux 內(nèi)核里的 rbtree 是嵌入到 parent 的最低位);parent 的存在使得非遞歸遍歷成為可能,后面還將再談到這一點(diǎn)。

樹(shù)

Tree 有更多的成員,它包含一個(gè)完整的 rb_tree_node_base(color/parent/left/right),還有 node_count 和 key_compare 這兩個(gè)額外的成員。

這里省略了一些默認(rèn)模板參數(shù),如 key_compare 和 allocator。

template\?//?key\_compare?and?allocator
class?rb\_tree
\{
?public:
??typedef?std::less\?key\_compare;
??typedef?rb\_tree\_iterator\?iterator;
?protected:

??struct?rb\_tree\_impl?//?:?public?node\_allocator
??\{
????key\_compare???????key\_compare\_;
????rb\_tree\_node\_base?header\_;
????size\_t????????????node\_count\_;
??\};
??rb\_tree\_impl?impl\_;
\};
template\?//?key\_compare?and?allocator
class?map
\{
?public:
??typedef?std::pair\?value\_type;
?private:
??typedef?rb\_tree\?rep\_type;
??rep\_type?tree\_;
\};
見(jiàn)下圖。這是一顆空樹(shù),其中陰影部分是 padding bytes,因?yàn)?key_compare 通常是 empty class。(allocator 在哪里?)

tree
rb_tree 中的 header 不是 rb_tree_node 類(lèi)型,而是 rb_tree_node_base,因此 rb_tree 的 size 是 6 * sizeof(void*),與模板類(lèi)型參數(shù)無(wú)關(guān)。在 32-bit 上是 24 字節(jié),在 64-bit 上是 48 字節(jié),很容易用代碼驗(yàn)證這一點(diǎn)。另外容易驗(yàn)證 std::set 和 std::map 的 sizeof() 是一樣的。

注意 rb_tree 中的 header 不是 root 節(jié)點(diǎn),其 left 和 right 成員也不是指向左右子節(jié)點(diǎn),而是指向最左邊節(jié)點(diǎn)(left_most)和最右邊節(jié)點(diǎn)(right_most),后面將會(huì)介紹原因,是為了滿(mǎn)足時(shí)間復(fù)雜度。header.parent 指向 root 節(jié)點(diǎn),root.parent 指向 header,header 固定是紅色,root 固定是黑色。在插入一個(gè)節(jié)點(diǎn)后,數(shù)據(jù)結(jié)構(gòu)如下圖。

tree1
繼續(xù)插入兩個(gè)節(jié)點(diǎn),假設(shè)分別位于 root 的左右兩側(cè),那么得到的數(shù)據(jù)結(jié)構(gòu)如下圖所示(parent 指針沒(méi)有全畫(huà)出來(lái),因?yàn)槠渲赶蚝苊黠@),注意 header.left 指向最左側(cè)節(jié)點(diǎn),header.right 指向最右側(cè)節(jié)點(diǎn)。

tree3

迭代器

rb_tree 的 iterator 的數(shù)據(jù)結(jié)構(gòu)很簡(jiǎn)單,只包含一個(gè) rb_tree_node_base 指針,但是其 /--操作卻不見(jiàn)得簡(jiǎn)單(具體實(shí)現(xiàn)函數(shù)不在頭文件中,而在 libstdc 庫(kù)文件中)。

//?defined?in?library,?not?in?header
rb\_tree\_node\_base\*?rb\_tree\_increment\(rb\_tree\_node\_base\*?node\);
//?others:?decrement,?reblance,?etc.

template\
struct?rb\_tree\_node?:?public?rb\_tree\_node\_base
\{
??Value?value\_field\_;
\};

template\
struct?rb\_tree\_iterator
\{
??Value\
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉