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. 高通 display 驱动【转】

    高通display驱动 0. 关键字 MDSS : 高通平台lcd multimedia Display sub system DSI: Display Serial Interface qcom,m ...

  2. django导入自定义模块

    自定义模块cust.py位于应用aptest目录下 1.编辑settings.py from aptest import cust 2.编辑views.py from cust import pc # ...

  3. C++基础算法学习——完美立方

    形如a 3 = b 3 + c 3 + d 3 的等式被称为完美立方等式.例如12 3 = 6 3 + 8 3 + 10 3 .编写一个程序,对任给的正整数N(N≤100),寻找所有的四元组(a, b ...

  4. linux命令2—常见linux命令

    1.进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于 ...

  5. iOS资源大全中文版

    我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-ios 就是 vsouza 发起维护的 iOS 资源列表,内容包括:框架.组件.测试.App ...

  6. Eclipse 插件安装报错问题(已解决)

    错误信息提示: An error occurred while installing the items session context was:(profile=epp.package.jee, p ...

  7. Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在

    Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...

  8. 【Ansible 文档】【译文】Windows 支持

    see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...

  9. Python3 下找不到urllib2的问题

    Python 3.* 用urllib.request来代替原来的urllib2,因此调用的时候改为: >>> import urllib.request >>> u ...

  10. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-3-Django项目实例

    使用 Django 我们现在将使用 Compose 配置并运行一个 Django/PostgreSQL 应用.在此之前,先确保 Compose 已经安装. 1.通过编辑 Dockerfile文件来指定 ...