1

这是一个 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“节点映射”的类型可以方便地从给定的默认参数中推断出来。节点映射本身可能是 a std::vector<T>,因为节点只是一个索引。

问题:我在哪里存储向量std::vector<std::string> map1, std::vector<std::double> map2, std::vector<Foo> map3.... ?

动态类型语言不会出现此问题。如何用 C++ 实现这种行为?

4

1 回答 1

2

您可能想查看Boost.Graph 库(BGL)的属性映射

图的抽象数学性质和它们用来解决的具体问题之间的主要联系是附加到图的顶点和边的属性,例如距离、容量、权重、颜色等。有很多方法根据数据结构实现将属性附加到图,但图算法不应该处理属性的实现细节。Section Property Map Concepts 中定义的属性映射接口提供了一种从图形访问属性的通用方法。这是 BGL 算法中用于访问属性的接口。

于 2013-02-05T13:08:42.900 回答