这是一个C ++(11)设计问题:
假设我想创建一个图形数据结构,您可以在其中将节点/边缘映射到任意属性。 (它与图形无关,它可能是具有属性的元素的任何容器,但这是我的例子。)
使用这样的数据结构,我可以动态地为所有节点添加一个新属性:
Graph G;
G.addNodeMap("color", "white"); // map name, default value
...然后将其设置为节点:
node v;
G.setAttr("color", v, "blue");
...并删除属性以节省内存:
G.deleteNodeMap("color");
G.addNodeMap
获取地图的标识符(可能是字符串)和条目的默认值。使用C ++ 11,可以从给定的默认参数中方便地推断出“节点映射”的类型T
。节点映射本身可以是std::vector<T>
,因为节点只是一个索引。
问题:我在哪里存储向量std::vector<std::string> map1
,std::vector<std::double> map2
,std::vector<Foo> map3
....?
动态类型语言不会出现此问题。如何使用C ++实现此行为?
答案 0 :(得分:2)
您可能需要查看Boost.Graph Library(BGL)
的属性映射图与图的抽象数学性质之间的主要联系 他们习惯解决的具体问题是属性 附加到图形的顶点和边缘,类似于 距离,容量,重量,颜色等。有很多方法可以附加 根据数据结构实现来绘制图表的属性,但是 图算法不应该处理实现 属性的详细信息。定义的属性映射接口 Section Property Map Concepts提供了一种通用的访问方法 图表中的属性。这是BGL中使用的接口 算法来访问属性。