Tkernel Package NCollection哈希基礎的類

OpenCASCADE內用到了不少由諸如NCollection_Map, NCollection_DataMap, NCollection_DoubleMap, NCollection_IndexedMap, NCollection_IndexedDataMap之類模板衍生出來的類,好比TopTools_IndexedMapOfShape,BOPCol_MapOfShape等等,很少舉例了。git

另外在源碼裏常常typedef重定義出一個數據類型,想一想也是醉了,可能之前舊版裏的數據類型太多了,如今雖然採用模板了,但仍是typedef重定義出原來的那些類型。github

NCollection_Map, NCollection_DataMap, NCollection_DoubleMap, NCollection_IndexedMap, NCollection_IndexedDataMap它們都派生自NCollection_BaseMap,哈希形式的數據結構。繼承派生圖表以下:
image數組

NCollection_*Map的哈希結構

NCollection_BaseMap

根類,使用NCollection_ListNode爲節點基類,後續派生類的節點也繼承自NCollection_ListNode。數據結構

  • Standard_Integer myNbBuckets; 桶的數量 老是取下一個質數爲桶數量(在TCollection.cxx內的Primes數組存有)
  • Standard_Integer mySize; 加入的成員數量
  • BeginResize() 申請節點內存空間(NCollection_ListNode*地址指針類型,不會限制派生類的節點空間需求),EndResize() 將申請的指針賦給myData1, myData2;

NCollection_Map

模板參數僅接受一個 TheKeyType (不理會那個Hasher),節點爲 NCollection_Map::MapNode 繼承自NCollection_TListNode ,沒有其餘附加成員,哈希結構形式的存儲類。 ide

理解:相似std::unorder_set,存儲數據無次序比較,不像基於紅黑樹的std::set,數據會呈有序排布函數

應用舉例:好比 BRepMesh_IncrementalMesh::collectFaces()裏用的 TColStd_MapOfTransient aTFaceMap(1, anAlloc); !aTFaceMap.Add(aTFace) 收集TopoDS_TShape,阻止第二次的加入visual-studio

NCollection_DataMap

模板參數接受二個,TheKeyType, TheItemType,節點爲 NCollection_DataMap::DataMapNodeui

理解:能夠理解爲std::unorder_map,從key快速找到對應的valuedebug

典型應用,好比在 Standard_Type.cxx 內的typedef NCollection_DataMap<Standard_CString, Standard_Type*, CStringHasher> registry_type; 能夠從名字搜索到類型3d

NCollection_DoubleMap

模板參數接受二個,TheKey1Type, TheKey2Type,節點爲 NCollection_DoubleMap::DoubleMapNode,能夠理解爲一個雙向的哈希數據結構

NCollection_IndexedMap

模板參數爲一個,TheKeyType,節點參數爲 NCollection_IndexedMap::IndexedMapNode

理解:能夠理解爲固定theKey2Type爲Standard_Integer的NCollection_DoubleMap

典型應用,好比在 TopTools_ShapeSet::Add(const TopoDS_Shape& S) 內,myShapes.FindIndex(S2) 返回index,若index==0才添加myShapes.Add(S2),返回index,以後就能夠依據index查找到TopoDS_Shape,這樣就能夠用這個index對應TopoDS_Shape,OCC源碼內不少地方這麼用。

NCollection_IndexedDataMap

模板參數接受二個 TheKeyType, TheItemType,節點參數爲 NCollection_IndexedDataMap::IndexedDataMapNode,與NCollection_DataMap相似,但附加了Indexed功能,也能夠經過index索引

典型應用: 好比TopExp::MapShapesAndAncestors(Shape, TopAbs_Edge, TopAbs_Face, Map)函數中Map對應的數據類型是 TopTools_IndexedDataMapOfShapeListOfShape,該函數是生成邊-面的映射,能夠從Map中便捷地找到擁有該邊的面。

在Visual Studio中的調試可視化

VS2012版以後,支持natvis格式的文件定義類型在調試時的可視化。VS2010版的則是在AutoExp.dat文件中添加,都在這一個文件裏,多少不便捷。而VS2012以後的能夠多個文件,存放在Documents目錄下的Visual Studio 2012/2015下邊的Visualizers文件夾裏邊也能夠(這樣就不用到Visual Studio程序目錄裏邊作什麼了)。

OpenCASCADE在源碼dox\dev_guides\debug下邊有文件occt.natvis,可是裏邊不少數據類型的定義仍是舊版的多,好比NCollection_Array1模板衍生的類TColStd_Array1OfInteger。

對此我基於本身的經驗改寫了一個版本,並在github上建了一個倉庫OcctDebugNatvis,下載項目中的occt.natvis文件便可,之後視狀況更新。

須要說明的是

  1. NCollection_Array2是二維的數組,因爲 維數描述也須要數組,但NCollection_Array2維數尺寸並不是數組,因此該文件裏邊的NCollection_Array2僅在行與列相等時纔會顯示完整的數據成員。
  2. NCollection_BaseMap派生的哈希結構,可視化描述須要CustomListItems,可是VS2012並不支持這個,VS2013還沒有可知,VS2015在調試可視化方面可能改進不少。我是在官方VS2015的文檔中才發現提供有此成員來支持哈希的數據結構調試可視化,在VS2012中CustomListItems會致使該數據結構描述失效。
  3. 此外NCollection_BaseMap在哈希碰撞時會在同一位置取Next吧,而個人occt.natvis僅寫了一層,理論上來講僅在深度爲1時適用,不過這種狀況相對少見吧,估計這樣子也夠用了吧。

此文件缺陷確定是有的,覆蓋性也不足,不過表明了我這一段時間來對OCC內的數據結構的認識。

相關文章
相關標籤/搜索