我应该使用迭代器或描述符来保持对边或顶点的引用吗?

Posted

技术标签:

【中文标题】我应该使用迭代器或描述符来保持对边或顶点的引用吗?【英文标题】:Should I use iterators or descriptors to keep a reference on an edge or vertex? 【发布时间】:2013-01-16 03:00:46 【问题描述】:

我目前正在设计一个应用程序,该应用程序由 Boost Graph (adjacency_list) 和几个引用此结构的边或顶点的类组成。

我的问题是:维护对节点或顶点的引用的推荐方法是什么?

我猜在迭代器的情况下,对象访问速度更快,但迭代器可能会因图结构的动态变化而失效。

相反,描述符是一个 id,这意味着搜索是检索数据所必需的,但在图形发生变化时可能不太容易触发内存错误。

是真的吗?

【问题讨论】:

【参考方案1】:

迭代器/描述符的稳定性和迭代器的效率都取决于您的顶点容器。

例如,对于vectorS,顶点描述符只是向量中顶点的索引,因此容器中的查找与索引向量一样快。在这种情况下,描述符与迭代器一样不稳定,因为插入和删除会导致元素移动。

对于listS,我希望(读取:'guess')描述符是元素的地址,因此描述符和迭代器都可能具有相同的稳定性保证。在这种情况下,使用顶点描述符来访问属性可能和迭代器一样有效。

有关adjacency_list 迭代器/描述符稳定性的更多信息,请阅读this 页面上标题为迭代器和描述符稳定性/无效 的部分。考虑到性能问题,您最好对 2 进行比较,并且仅当它似乎是您的应用程序的瓶颈时。

【讨论】:

是的;从 listS 打印顶点描述符是元素的地址

以上是关于我应该使用迭代器或描述符来保持对边或顶点的引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

性能 - 使用迭代器或指针迭代向量?

BGL 顶点上的随机顺序迭代

图的概念与实现

我应该让 Sequelize 模型和迁移保持同步吗?

多处理:池:直接迭代器或使用变量来存储迭代器

我应该使用相同的 VBO 来传递不同的顶点属性吗?还是我应该使用 2?