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. Cisco ASA 使用ASDM 配置管理口 方法

    CISCO ASA防火墙ASDM安装和配置 准备一条串口线一边接台式机或笔记本一边接防火墙的CONSOLE 接口,通过CRT或者超级终端连接ASA在用ASDM图形管理界面之前须在串口下输入一些命令开启 ...

  2. mariadb使用\s查看用户权限

    今天出现一个问题就是:给zabbix用户赋予权限 语句如下: grant all on zabbix.* to 'zabbix'@'%' identified by 'zabbix' 按照这样的说法应 ...

  3. SDN2017 第五次实验作业

    实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析验证负载均衡 实验步骤 建立以下拓扑,并连接上ODL控制器. 利用ODL下发组表.流表,实现建议负载均衡 s1组 ...

  4. Apache Kafka系列(一) 起步

    Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...

  5. shiro实战系列(三)之架构

    Apache Shiro 的设计目标是通过直观和易于使用来简化应用程序安全.Shiro 的核心设计体现了大多数人们是如何考虑应用程序安全的——在某些人(或某些事)与应用程序交互的背景下.   应用软件 ...

  6. 在openresty或nginx编译nginx-upsync-module&nginx_upstream_check_module

    针对我在编译在两个模块的过程中遇到的一系列问题,特此记录编译流程的一些细节 1.下载 install git git clone https://github.com/weibocom/nginx-u ...

  7. 【转】mysql交互式连接&非交互式连接

    交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tom ...

  8. JAVA之多线程概念及其几种实现方法优劣分析

    1. 多线程 程序:指令集,静态的概念 进程:操作系统调动程序,是程序的一次动态执行过程,动态的概念 线程:在进程内的多条执行路径 Ps:单核的话进程都是虚拟模拟出来的,多核处理器才可以执行真正的多线 ...

  9. python 爬虫--同花顺-使用代理

    1.http://www.goubanjia.com/  在上面获取 使用http协议的公网IP和端口 参考:https://blog.csdn.net/qq_23934063/article/det ...

  10. less初识

    一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以 ...