【问题标题】:How to add attribute maps of different types?如何添加不同类型的属性图?
【发布时间】:2013-02-05 12:01:24
【问题描述】:

这是一个 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> map1std::vector<std::double> map2std::vector<Foo> map3....?

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

【问题讨论】:

  • 使用任意类型进行这项工作通常会带来更多的麻烦。您将不得不进行一些严肃的类型擦除。
  • @NicolBolas 那么存储这些属性的替代方法是什么?
  • 我目前唯一想到的就是 boost::any

标签: c++ oop c++11 dynamic-typing


【解决方案1】:

您可能想查看Boost.Graph Library (BGL) 的属性图

图形的抽象数学性质与 他们用来解决的具体问题是 附加到图的顶点和边上,例如 距离、容量、重量、颜色等有很多种贴法 根据数据结构实现来绘制图形的属性,但是 图算法不应该处理实现 属性的详细信息。中定义的属性映射接口 Section Property Map Concepts 提供了一个通用的方法来访问 来自图表的属性。这是BGL中使用的接口 访问属性的算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多