OpenCASCADE内用到了很多由诸如NCollection_Map, NCollection_DataMap, NCollection_DoubleMap, NCollection_IndexedMap, NCollection_IndexedDataMap之类模板衍生出来的类,比如TopTools_IndexedMapOfShape,BOPCol_MapOfShape等等,不多举例了。

另外在源码里经常typedef重定义出一个数据类型,想想也是醉了,可能以前旧版里的数据类型太多了,现在虽然采用模板了,但还是typedef重定义出原来的那些类型。

NCollection_Map, NCollection_DataMap, NCollection_DoubleMap, NCollection_IndexedMap, NCollection_IndexedDataMap它们都派生自NCollection_BaseMap,哈希形式的数据结构。继承派生图表如下:

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,没有其他附加成员,哈希结构形式的存储类。

理解:类似std::unorder_set,存储数据无次序比较,不像基于红黑树的std::set,数据会呈有序排布

应用举例:比如 BRepMesh_IncrementalMesh::collectFaces()里用的 TColStd_MapOfTransient aTFaceMap(1, anAlloc); !aTFaceMap.Add(aTFace) 收集TopoDS_TShape,阻止第二次的加入

NCollection_DataMap

模板参数接受二个,TheKeyType, TheItemType,节点为 NCollection_DataMap::DataMapNode

理解:可以理解为std::unorder_map,从key快速找到对应的value

典型应用,比如在 Standard_Type.cxx 内的typedef NCollection_DataMap<Standard_CString, Standard_Type*, CStringHasher> registry_type; 可以从名字搜索到类型

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

Tkernel Package NCollection哈希基础的类的更多相关文章

  1. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  2. springMVC基础controller类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:设置请求.响应对象:session.cookie操作:ajax访问返回json数据: 创建springMVC基础con ...

  3. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  4. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  5. java基础-BigInteger类常用方法介绍

    java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...

  6. java基础-Arrays类常用方法介绍

    java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...

  7. java基础-Math类常用方法介绍

    java基础-Math类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Math类概念 Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函 ...

  8. java基础-System类常用方法介绍

    java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...

  9. java基础-Integer类常用方法介绍

    java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...

随机推荐

  1. Django中的DateTimeField格式

    转自:http://www.nanerbang.com/article/5488/ 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来 ...

  2. [cb]NGUI事件及复杂UI管理

    事件管理 看了有些文章关于NGUI的事件管理,许多人的做法的是封装一个事件处理层,避免在每个UI控件上都绑定事件处理脚本.本文说说我们项目中的UI事件管理吧. UIEventListener 我们项目 ...

  3. pychram使用技巧

    1.代码添加断点 点击对应行代码,按ctrl+F8,即可添加断点 2.查看内置函数的源码 点击对应函数后按crtl+B

  4. 关于ORA-00257: archiver error. Connect internal only, until freed 错误处理方法

    产生原因:出现ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决 解决办法:(亲测有效) 1 ...

  5. 使用C#获取Windows Phone手机的各种数据(转)

    转自:http://www.sum16.com/desinger/use-c-sharp-get-windows-phone-information.html 使用C#获取Windows Phone手 ...

  6. DevExpress08、SchedulerControl、DateNavigator、SpreadsheetControl

    SchedulerControl 该控件以可视化的效果显示预约或者设定的行程: 该控件预约后的数据存储在SchedulerStorage对象里, 当以拖动形式添加SchedulerControl控件到 ...

  7. SDN2017 第二次实验作业

    安装floodlight 参考链接:http://www.sdnlab.com/19189.html 从github下载源码,并编译安装 $ sudo apt-get install build-es ...

  8. 【项目 · Wonderland】UML设计

    团队作业---UML设计 Part 0 · 简要目录 Part 1 · 团队分工 Part 2 · UML Part 3 · 工具选择 Part 1 · 团队分工 Part 2 · UML 描述信息: ...

  9. BZOJ3673/3674:可持久化并查集

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  10. helm 部署

    Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用,它包含几个基本概念 Chart:一个 Helm 包,其中包含了 ...