繁体   English   中英

Boost Graph Library:顶点描述符一定是唯一的吗?

[英]Boost Graph Library: Are Vertex Descriptors Necessarily Unique?

我意识到这可能是迂腐的,但是 BGL 顶点描述符总是唯一的吗? 对于背景,我有以下图形定义:

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, VProp, EProp> Graph;

我在哪里使用listS作为节点数据结构。 我知道这使我的描述符(看起来是void*类型)“稳定”:当从图中删除节点时,仍然可以使用其他节点的其他描述符。

不过,我已经浏览了 BGL 文档,但无法保证这些描述符是唯一的 本质上,我想知道两个描述符是否==当且仅当它们指向的底层节点数据相同时。 换句话说,直接比较描述符是检查节点相等性的有效方法吗?

显然,当节点数据结构为vecS时这是正确的(因为在这种情况下描述符是索引),但我在 BGL 文档中没有找到listS的任何信息。

提前致谢

到标题:

顶点描述符一定是唯一的吗?

是的。

换句话说,直接比较描述符是检查节点相等性的有效方法吗?

是的。

显然,当节点数据结构为 vecS 时,这是正确的

确切地。 我只是要给出这个确切的例子来给出部分证明。 这说明你对库的理解已经相当深入了。

我碰巧对代码进行了更深入的研究,并且知道在基于节点的顶点容器选择器(listS、setS 等)的情况下的描述符类型。 将相当于对该(实现定义的)容器中元素的直接引用的类型擦除版本。

请注意,元素的实际类型将根据模板 arguments 的许多不同而有所不同,这就是为什么描述符被强制转换为不透明void*所以

  1. 用户代码不必知道具体的内部结构
  2. 用户代码不能(意外)通过描述符滥用这些内部结构

鉴于这种性质,我们可以同时解释稳定性(它与底层容器实现的参考稳定性相匹配)和唯一性保证(描述符标识与(顶点)存储容器中元素的 object 标识一致)。

注意这个答案只会您放心adjacency_list<>实例化的情况。 还有其他 Graph 模型。 我碰巧知道大多数人都有非常相似的保证,其证明基本上遵循相同的结构。


我尚未(尚未)仔细检查文档以验证您声称它是无证的,并且我不相信添加明确的保证会有所帮助,但我建议您提出这个问题。 对于 (C++) 程序员来说,这是一个好习惯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM