STL容器设计原理
一、內存映像 ? ?? 容器在概念上是一種可以動態增大或減小的模型,所以其元素在實現上不可能直接保存在容器對象里,而應該保存在自由內存或堆上。這里要區分兩個概念“容器對象”和“容器元素對象”。容器本身就是一個C++對象,其大小在運行時是不可以改變,因此容器應該有辦法指示其每一個元素在內存中的位置,以便用戶能通過容器對象找到其中的元素對象。
二、存儲方式和訪問方式 ? ? ?向量和鏈表是兩種最基本的動態結構,也是STL中兩種最基本的容器,分別對應動態數組和鏈表結構,同時他們分別代表了內存中同類型批量數據存放的兩種基本方式:連續存儲和隨機存儲(不連續存儲)。 ? ? ?不同的存儲方式決定了不同的訪問方式,順序訪問和隨機訪問。所謂的隨機訪問是指通過開銷恒定的算數運算來得到任一元素的內存地址的訪問方法。而順序訪問則是指從第一個元素開始遍歷,直到找到所需的元素為止。C++/C的內置數組和vector既可以隨機訪問也可以順序訪問的容器,而list則只能順序訪問。 ? ? ?只要底層存儲機制采取連續存儲方式的容器,就可以隨機訪問其中任一元素,否則只能順序訪問,任何容器都能順序訪問。 三、容器的分類 ? ? ?STL中將容器劃分為兩類:順序容器和關聯式容器。這里的“順序”和“關聯”指的是上層接口表現出來的訪問方式,并非底層存儲方式。STL主要采用向量、鏈表、二叉樹和它們的組合作為底層存儲結構來實現容器。 ? ? ?鏈表(list)作為順序容器的典型代表,其特點是“天然有序”,即各元素之間具有天然的相對位置關系。 ? ? ?集合(set)是關聯式容器的典型代表,關聯式容器在概念上是無序的,但只計算機上實現這樣的數學模型,不但要使上層的訪問接口正確反映集合的概念,還要考慮實現效率。因此關聯式容器在實現上必須是有序和排序的,只不過對用戶透明。平衡二叉搜索樹能夠滿足這些要求。
四、什么樣的對象能作為STL的容器元素。 根據上述條件,顯然引用不能作為STL容器的元素類型:第一、引用在創建時必須初始化為一個具體的對象,而STL容器不能滿足這一要求。二引用沒有構造函數和析構函數,更沒有賦值語義。STL容器只支持對象語義,而不支持引用語義。例如下面的定義是錯誤的, ? ? ?std::list<double&> id(10); 采用接管方式創建和釋放不對稱的指針對象都不適合作為STL容器的元素,想auto_ptr<>。 參考書: 《高質量程序設計--C/C++描述》
二、存儲方式和訪問方式 ? ? ?向量和鏈表是兩種最基本的動態結構,也是STL中兩種最基本的容器,分別對應動態數組和鏈表結構,同時他們分別代表了內存中同類型批量數據存放的兩種基本方式:連續存儲和隨機存儲(不連續存儲)。 ? ? ?不同的存儲方式決定了不同的訪問方式,順序訪問和隨機訪問。所謂的隨機訪問是指通過開銷恒定的算數運算來得到任一元素的內存地址的訪問方法。而順序訪問則是指從第一個元素開始遍歷,直到找到所需的元素為止。C++/C的內置數組和vector既可以隨機訪問也可以順序訪問的容器,而list則只能順序訪問。 ? ? ?只要底層存儲機制采取連續存儲方式的容器,就可以隨機訪問其中任一元素,否則只能順序訪問,任何容器都能順序訪問。 三、容器的分類 ? ? ?STL中將容器劃分為兩類:順序容器和關聯式容器。這里的“順序”和“關聯”指的是上層接口表現出來的訪問方式,并非底層存儲方式。STL主要采用向量、鏈表、二叉樹和它們的組合作為底層存儲結構來實現容器。 ? ? ?鏈表(list)作為順序容器的典型代表,其特點是“天然有序”,即各元素之間具有天然的相對位置關系。 ? ? ?集合(set)是關聯式容器的典型代表,關聯式容器在概念上是無序的,但只計算機上實現這樣的數學模型,不但要使上層的訪問接口正確反映集合的概念,還要考慮實現效率。因此關聯式容器在實現上必須是有序和排序的,只不過對用戶透明。平衡二叉搜索樹能夠滿足這些要求。
四、什么樣的對象能作為STL的容器元素。 根據上述條件,顯然引用不能作為STL容器的元素類型:第一、引用在創建時必須初始化為一個具體的對象,而STL容器不能滿足這一要求。二引用沒有構造函數和析構函數,更沒有賦值語義。STL容器只支持對象語義,而不支持引用語義。例如下面的定義是錯誤的, ? ? ?std::list<double&> id(10); 采用接管方式創建和釋放不對稱的指針對象都不適合作為STL容器的元素,想auto_ptr<>。 參考書: 《高質量程序設計--C/C++描述》
總結
- 上一篇: 网站换服务器 备案,网站换服务器备案吗
- 下一篇: 调用百度ORC识别