BGL仍然需要属性地图吗?

时间:2014-05-08 11:43:30

标签: boost boost-graph

宣布std::map<std::string, std::string> M后,可以:

  1. 写信给地图:M["Jack"] = "323 Union St";
  2. 从地图上阅读:std::cout << M["Jack"];
  3. 然而,在声明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");
    3. 对于您尚未使用地图进行的属性地图,您可以做些什么?

      上下文

      考虑某人

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

      显然是错误的。 IIUC,从1998年到2002年,整个BGL使用了属性图,以消除为MSVC编写一个库和为gcc编写另一个库的需要。这个想法显然是MSVC将要处理的,gcc也很乐意处理。既然MSVC处理C ++ 98,属性映射仍然是必需的还是它们只是一个遗物? 为什么

2 个答案:

答案 0 :(得分:4)

PropertyMaps主要是抽象写入和读取数据的接口,通过它来隐藏存储的实现。

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

答案 1 :(得分:1)

以下是物业地图的一些背景,以表达对pmr的回答。

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

“属性映射的需求来自Boost图形库的设计,其算法需要一个接口来访问附加到图形中顶点和边缘的属性。在这种情况下,顶点和边缘描述符是关键类型物业地图。“

它们是一个界面,基本上就是pmr所说的。

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

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

“属性映射界面起源于DietmarKühl关于通用图算法的硕士论文中的数据访问器。属性映射的想法也出现在通用图形组件库(GGCL)的早期版本中的装饰器的幌子下,现在是Boost Graph Library(BGL)。属性映射接口的主要动机是支持访问与图中顶点和边相关的数据,尽管属性映射的适用性超出了这个范围。“

您还可以查看来自Springer的DietmarKühl's Generic Graph Algorithms(或Google学者,点击“所有版本”以查找PDF格式)。