【问题标题】:Do property maps remain necessary for BGL?BGL 是否仍然需要属性图?
【发布时间】:2014-05-08 11:43:29
【问题描述】:

在声明std::map<std::string, std::string> M 之后,可以:

  1. 写信给地图:M["Jack"] = "323 Union St";
  2. 从地图读取:std::cout << M["Jack"];

然而,在声明 boost::associative_property_map<std::map<std::string, std::string>> PM(M) 之后,我们只能做以下事情:

  1. 写信给属性图:boost::put(PM, "Fred", "323 Union St");
  2. 从属性图中读取:boost::get(PM, "Fred");

你可以用属性图做什么,而你已经不能用地图做了什么?

上下文

考虑某人为谁

#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300

显然是错误的。 IIUC,从 1998 年到 2002 年,在整个 BGL 中大量使用属性映射,以消除为 MSVC 编写一个库和为 gcc 编写另一个库的需要。这个想法显然是 MSVC 将处理的内容,gcc 也将愉快地处理。既然 MSVC 处理了 C++98,那么属性映射是否仍然是必需的,或者它们只是一个遗物? 为什么

【问题讨论】:

  • 来自属性映射的 Boost 文档“对属性映射的需求源于 Boost 图形库的设计,其算法需要一个接口来访问附加到图形中的顶点和边的属性。在在这种情况下,顶点和边描述符是属性映射的关键类型。”好像和MSVC没什么关系。

标签: boost boost-graph


【解决方案1】:

PropertyMaps 主要是一个接口,用于抽象出数据的写入和读取,并通过它隐藏存储的实现。

您的界面有时需要访问数据,而您不希望强制用户使用这种存储方式。相反,您有时会提供数据存储,但希望隐藏其实现。在这两种情况下,属性映射都提供了一个很好的解决方案,标准库的 AssociativeSequence 要求并不真正适合。

【讨论】:

  • 很好的答案。一个典型的用途是将权重向量和顶点索引包装在 PropertyMap 中。这样,在您的图形算法与 PropertyMap 一起运行之后,您就可以将所有权重很好地存储在一个向量中。隐藏实现为您提供更多控制权。
【解决方案2】:

这里是 Property Map 的一些背景,以补充 pmr 的回答。

正如我在评论中提到的。根据 boost 文档 (Property Map Library):

“对属性映射的需求源于 Boost Graph Library 的设计,其算法需要一个接口来访问附加到图中的顶点和边的属性。在这种情况下,顶点和边描述符是关键类型属性映射。”

它们是一个接口,基本上就是 pmr 所说的。

我没有找到任何与 MSVC 相关的信息。

后来,在历史部分下,他们说:

“属性映射接口起源于 Dietmar Kühl 的关于通用图算法的硕士论文中的数据访问器。属性映射的想法也在通用图组件库 (GGCL) 的早期版本中以装饰器的名义出现,现在是Boost Graph Library (BGL)。属性映射接口的主要动机是支持访问与图中的顶点和边相关联的数据,尽管属性映射的适用性远不止于此。”

您还可以查看来自 Springer 的 Dietmar Kühl 的 Generic Graph Algorithms(或 Google 学者并单击“所有版本”以查找 pdf)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2016-01-05
    • 2015-09-20
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多