學習 LLVM(13) SmallSet 類

位於 llvm/include/llvm/[[ADT]]/SmallSet.hhtml

註釋:'Normally small' sets -- 普通小型集合less

這個頭文件定義了 SmallSet 類。ide

SmallSet 類保持(維護)一組惟一值的集合,爲集合中元素數量較少的狀況(小於 N)進行了優化。這種狀況下,Set 能夠不用進行內存分配。若是 Set 變得更大,則內部擴展到使用 std::set 來維護以得到理想的檢索響應時間。要注意的是,這個類不提供迭代器(iterator)。函數

參見:http://llvm.org/docs/ProgrammersManual.html#dss_smallset優化

SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less than N).  In this case, the set can be
maintained with no mallocs.  If the set gets large, we expand to using an std::set to maintain reasonable lookup times.this

Note that this set does not provide a way to iterate over members in the
set.code

== SmallSet 類概要 ==
orm

template <T, N, C> class SmallSet {  // 注1:T, N, C
  SmallVector<T,N> Vector;  // 內部使用 SmallVector 保存集合數據。
  std::set<T,C> Set;   // 當元素多了使用 std::set 保存集合數據。

  this() // 構造
  empty(), size(), count(), insert(), erase(), clear() 等容器方法。
}

注1:T 是要保存的元素的類型;N 是 in-place 保存的元素的數量,其實際傳遞給 SmallVector 模板;C 缺省爲 std::less<T> 用於比較兩個元素的大小,傳遞給 std::set 作模板參數。htm

== 實現機理 ==
咱們以 insert() 函數爲例,研究其實現機理。內存

* 1. 當 std::set 非空的時候,也即 SmallVector 不足以容納 N 個元素的時候,直接將新元素插入到 std::set 中。
* 2. 在 SmallVector 中查找(線性搜索),若是已經存在了(== 比較),則返回 false(重複不插入)
* 3. 若是 SmallVector 的現有元素數量 < N,表示還未裝滿,則 push_back 到 SmallVector 中。
* 4. 不然,SmallVector 已經滿了,將 SmallVector 全部內容轉入 std::set;而後插入到 std::set 中。這裏進行了 SmallVector -> std::set 的轉換。

其它的實現機理都很簡單,再也不說明。

相關文章
相關標籤/搜索