一、容器的演進
科學進步的過程一般來說都是從先解決常用的、迫切的問題開始,然后再逐步解決一些少見不迫切的問題,直到最終解決到認知程度內的諸多問題。舉一個網上的例子,以前說咱們無法生產水筆的尖頭上的鋼球,其實這對于國內的技術來說并不難,只是并不迫切而且利潤也有限,結果經常的提及就被當成一個問題了,很快就解決了。
C++作為一門技術,也是如此。STL中的容器,也是先從常見的向量、鏈表以及映射等等開始應用,然后是unordered_map等。大家都知道C++應用的一個重要場景就是游戲應用,而游戲應用中對數據結構往往有一些特殊的要求,如高頻的讀寫操作以及非線性的存儲等。而且還有一個重要的需求,那就是寫入和刪除時容器的迭代器是否失效。
在容器上的應用是如此,在底層的容器對數據的處理要求也在提高,如何能夠更好的最大的發掘出內存潛力,也是STL容器的一個發展方向。在前面分析過內存的管理,其實不管怎么做,其實就是將內存的連續分配、按塊分配等有機的組合在一起,能夠平衡內存的應用、管理以及效率的一種方法。
二、std::hive的應用
std::hive(蜂巢)這個容器正是從上面的需求,也就是游戲的需求出發點提出的。它最初是colony(plf::colony)開源庫發展過來的。std::hive的主要特點有:
1、高頻增刪場景下的高性能
所有的高性能都是相對的,此處的高性能也是如此,即std::hive的高性能是與傳統的鏈表list和向量vector等相比而言。其讀寫的復雜度均為O(1)。
2、對容器增刪場景下的迭代器的安全穩定性
std::hive的插入操作對迭代器來說是安全的、穩定的;但對于刪除來說,其指向被刪除元素的迭代器失效。
3、內存盡最大可能的高利用性
std::hive對內存采用了分塊處理的方式,在應用場景下可盡大可能發揮容器對內存利用的效率并降低內存碎片的數量。既然是內存分塊(塊內內存連續),則其支持非連續內存的訪問即支持任意位置的增刪。看過前面的內存相關文章的可以把這些塊當成一個個的桶即bucket。
從相關的文檔可發現,std::hive的實現的思路是skipfield,它能夠高效的解決高速頻繁地遍歷、添加和刪除大量對象的問題進而達到優化內存管理和減少內存碎片化數量的結果。通過研究相關的文檔分析,skipfield和skiplist在某些思想上有異曲同工的意思。
三、例程
在分析了std::hive后,看一下相關的例程:
#include <std_hive> int main() {std::hive<int> h;// inserth.insert(1); h.insert(2);auto it = h.insert(3); // delh.erase(it); // traversefor (auto& v : h) {std::cout << v << ","<<std::endl; }return 0;
}
對開發者來說,std::hive的應用還是相當簡單的,不必太過費心。
四、總結
C++標準的演進與現實世界的解決問題的思路是一致的。也就是說,虛擬世界其實就是現實世界的一種映射,大家對編程的認知越高,就越會明白這個道理。同樣,要想解決好問題,就不必拘泥某一個場景某一個行業,要融會貫通。古人云:“它山之石,可以攻玉”!