- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试从专有图形库迁移到开源图形库。
编辑:由于似乎很少有人知道 Boost Graph 的实际工作原理,如果您可以使用 LEMON Graph Library 提供解决方案,那也很好。
目前,我的顶点类型为 Graph_Vertex*
并且可以有一个关联的 void*
存储相关信息的指针。对于类型为 Graph_Edge*
的边使用类似的逻辑。 .我用 void*
存储我自己的结构的指针 Node_State
, 是这样的
struct Node_State {
std::string name;
int id;
// other stuff
};
根据我到目前为止对 BGL 的了解,我可以使用 adjacency_list
创建一个图表结构与bundled properties指向我的Node_State
.然后,我不使用顶点指针,而是使用整数顶点索引。
我一直在查看 tutorial还有一些questions here ,这似乎是可能的。我在想类似的事情
typedef adjacency_list < listS, vecS, bidirectionalS, Node_State> gr;
我会时不时地移除顶点的所有边。很少见,我也可能会删除一个节点。这就是为什么我会选择 listS, vecS
.
我想让为无向边创建此结构的第二个版本变得容易。我不确定 bidirectionalS
是我的情况的最佳选择。在这方面感谢您的意见。
还有一个问题。现在,我可以使用外部 map 通过其 name 或使用唯一整数 id 查找每个顶点。
std::map<int, Graph_Vertex*> nodes_by_id;
std::map<std::string, Graph_Vertex*> nodes_by_name();
如果我删除一个顶点,我只需要删除 map 中的相应条目,事情就会继续进行。
据我所知,使用 BGL 实现这一点并不容易,因为删除顶点会触发所有具有更高 ID 的顶点的重新编号,并且还可能导致内部重新分配结构。所以再见 ID 和再见指针。
主要问题。是否可以创建 map<name, node>
或 map<index, node>
可以在节点删除 中以最小的调整(例如,仅删除无效键)存活下来?如果不是,将节点映射到某个唯一标识符的最佳方法是什么,该标识符在图修改后仍然存在?
一个选项可以使用 internal properties .教程example在这里。
struct vertex_index_t { };
struct edge_index_t { };
struct vertex_name_t { };
struct edge_name_t { };
并保留一些外部结构
std::map<vertex_index_t, Graph_Vertex*> nodes_by_id;
std::map<vertex_name_t, Graph_Vertex*> nodes_by_name;
std::map<edge_index_t, Graph_Edge*> edges_by_id;
std::map<edge_name_t, Graph_Edge*> edges_by_name;
这将与我现在拥有的更加相似,并且需要对当前代码进行更少的更改。
我还没有真正理解 vertex_index_t
受顶点移除的影响,以及如何vertex_name_t
可以分配。但是,如果这可行,则可以使用 edge_index_t
将类似的逻辑应用于边。和 edge_name_t
也是。
总结一下。我需要一段工作代码来展示如何:
有了这些重要的先决条件:
如果我能实现这样的目标,我会很高兴
Vertex* vertex0 = Graph.get_vertex_by_name("v0");
Vertex_Data* v0_data = vertex0.get_data();
Edge* edge4 = Graph.get_edge_by_id(4);
Edge_Data* e4_data = edge4.get_data();
这可能看起来有很多问题,但实际上只是我启动和运行该库所需的基础。任何更少,它对我需要做的事情完全没用。
请点击所有要点。
将此视为教程,我希望悬赏也能帮助其他人。
最佳答案
Then, instead of using vertex pointers, I would use integer vertex indices.
事实上,我认为您会使用顶点描述符。在 vecS 容器选择的情况下,哪个是不可或缺的,是的
From what I understand, this is not so easy to achieve with BGL, because deleting a vertex triggers the renumbering of all the vertices with a higher ID, and might also cause a reallocation of the internal structures.
严格来说,情况并非总是如此。 是 vecS
的情况,但不是例如listS
(列表具有稳定的迭代器)。
总而言之,我建议将 listS
视为容器选择,并放弃 vertex_descriptor
是整数类型(它将变得不透明)的假设。
作为迭代器稳定性的返回,您需要为某些算法提供顶点索引映射。
关于具有可移动节点、可访问属性和可靠 ID 的 C++ 图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29109054/
我想在 iOS 中以编程方式制作二维模型。像这样: 这取自应用 Gomoji . 我用谷歌搜索但没有得到正确的解决方案。这个角色也在移动,所以它可以移动手和腿,同时我想改变手的颜色等。 SpriteK
也许是个愚蠢的问题: C++ 中有没有一种方法可以防止枚举类类型被复制? 最佳答案 没有。枚举是整数。并且整数始终是可复制/可移动的。 您当然可以创建一个从枚举构造的实际类。而那个类(class)可以
看起来 jqGrid 是基于 jQuery 对话框的,是否有可能使其可移动(像对话框一样)?我已经能够将它放在对话框中,但有两个标题栏等看起来很奇怪。我“认为”可以向其中添加必要的类以使其可移动,但我
我正在尝试创建一个交互式待办事项列表,我在其中将文本输入文本框,单击一个按钮,它会在下面添加项目。到目前为止,我已经成功地使用按钮将项目添加到我的列表中,但我无法通过单击一次删除一个项目,这是我希望能
是否可以创建一个可移动的 QGraphicsItem,它可以用鼠标右键而不是左键移动? 我唯一能通过搜索找到的是一个线程 which suggests using QGraphicsItem::set
我一直在尝试拼凑一个项目,该项目包含一个在侧面滚动的 Collection View ,当点击一个单元格时,它将向场景添加一个新的 ImageView 。我希望这张新图片可以拖动。 我的代码当前显示
是否有任何允许重新排序它们的 Angular JS 选项卡指令(如浏览器的选项卡) 如果不是开始实现会很棒 使用 angular-ui-bootstap 如何使它们可重新排序
我已经向 Mac App Store 提交了一个帮助应用程序(使用 LSUIElement)。我的错误印象是 App Store 安装过程会为辅助应用程序放置一个停靠栏图标。 我如何创建一个用户可以删
我有一个设置错误的表(作为应用程序表,但创建了一个维护 View ),但它应该是一个自定义表,以便我们能够传输表的条目。 到目前为止,我更改了表格的类型和可维护性,现在它是 C 类型(自定义),可以不
您好,我在我的网站上使用谷歌地图。我想在保持 map 可移动的同时使用图像为其覆盖(用户可以四处拖动和缩放) 到目前为止我做了什么: 我创建了 map ,然后我使用伪 :before 元素来调用我想作
我想制作一些有趣的可移动 div。我有以下代码: dragElement(document.getElementById("draggable_shortcut")); functio
我正在使用 FloatingActionButton在我的应用程序中。有时,它会与基本内容重叠,所以我想制作它以便用户可以将 FAB 拖到一边。 本身不需要拖放功能。它只需要是可移动的。文档没有提到这
我想制作一个具有自定义外观的安装程序,并通过将 BorderStyle 设置为 bsNone 来禁用标题栏。 现在我无法再移动窗口了。我环顾四周,找到了 Delphi 的解决方案: http://ww
我有两种纹理:背景和蒙版。我需要使掩码的输出定义显示的表单背景。非常重要的部分是 mask 的尺寸需要小于背景我将在运行时移动它以显示背景的部分。 项目在 WP7 上,所以数量有限 BlendStat
我的摩托罗拉手机有 12GB 内部存储和可移动 SD 卡功能。 在 DDMS 文件资源管理器中,我的内部手机存储 (12GB) 挂载为 sdcard,我的可移动 sdcard 挂载为 sdcard-e
如何获取所有驱动器的列表以及相应的驱动器类型(可移动、本地磁盘或 cd-rom、dvd-rom 等)? 最佳答案 通过这段代码你可以获得所有驱动器及其类型描述 File[] paths; FileSy
我正在尝试打印驱动器盘符及其系统类型。在此程序中,它将硬盘驱动器打印为逻辑驱动器,将 cd 驱动器打印为 cd 驱动器,将存储卡打印为可移动驱动器。当我插入外部硬盘和 pendrive (sandis
我正在使用 Angular2 及其 Material Design( https://material.angular.io ) 创建一个小型网络应用程序,我在其中使用 MdDialog 来使用以下代
std::vector> foo; //populate foo. 自从新标准以来 vector 是可移动的,但不幸的是他们还没有使可选的可移动:( 有没有制作可选可移动的计划? 上面的 vector
我是一名优秀的程序员,十分优秀!