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内的数据结构的认识。