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,哈希形式的數據結構。繼承派生圖表以下:
數組
根類,使用NCollection_ListNode爲節點基類,後續派生類的節點也繼承自NCollection_ListNode。數據結構
模板參數僅接受一個 TheKeyType (不理會那個Hasher),節點爲 NCollection_Map::MapNode 繼承自NCollection_TListNode
理解:相似std::unorder_set,存儲數據無次序比較,不像基於紅黑樹的std::set,數據會呈有序排布函數
應用舉例:好比 BRepMesh_IncrementalMesh::collectFaces()裏用的 TColStd_MapOfTransient aTFaceMap(1, anAlloc); !aTFaceMap.Add(aTFace) 收集TopoDS_TShape,阻止第二次的加入visual-studio
模板參數接受二個,TheKeyType, TheItemType,節點爲 NCollection_DataMap::DataMapNodeui
理解:能夠理解爲std::unorder_map,從key快速找到對應的valuedebug
典型應用,好比在 Standard_Type.cxx 內的typedef NCollection_DataMap<Standard_CString, Standard_Type*, CStringHasher> registry_type; 能夠從名字搜索到類型3d
模板參數接受二個,TheKey1Type, TheKey2Type,節點爲 NCollection_DoubleMap::DoubleMapNode,能夠理解爲一個雙向的哈希數據結構
模板參數爲一個,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源碼內不少地方這麼用。
模板參數接受二個 TheKeyType, TheItemType,節點參數爲 NCollection_IndexedDataMap::IndexedDataMapNode,與NCollection_DataMap相似,但附加了Indexed功能,也能夠經過index索引
典型應用: 好比TopExp::MapShapesAndAncestors(Shape, TopAbs_Edge, TopAbs_Face, Map)函數中Map對應的數據類型是 TopTools_IndexedDataMapOfShapeListOfShape,該函數是生成邊-面的映射,能夠從Map中便捷地找到擁有該邊的面。
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文件便可,之後視狀況更新。
此文件缺陷確定是有的,覆蓋性也不足,不過表明了我這一段時間來對OCC內的數據結構的認識。