【问题标题】:What is a property map in BOOST?什么是 BOOST 中的属性映射?
【发布时间】:2013-12-18 00:30:00
【问题描述】:

有人可以向像我这样的 Boost 初学者解释什么是 Boost 中的属性映射吗? 我在尝试使用 BGL 计算强连通分量时遇到了这个问题。 我浏览了属性映射和图形模块的文档,但仍然不知道该怎么做。 以这段代码为例:

  • make_iterator_property_map 函数在做什么?
  • 这段代码是什么意思:get(vertex_index, G)?

#include <boost/config.hpp>
#include <vector>
#include <iostream>
#include <boost/graph/strong_components.hpp>
#include <boost/graph/adjacency_list.hpp>

int main()
{
  using namespace boost;
  typedef adjacency_list < vecS, vecS, directedS > Graph;
  const int N = 6;
  Graph G(N);
  add_edge(0, 1, G);
  add_edge(1, 1, G);
  add_edge(1, 3, G);
  add_edge(1, 4, G);
  add_edge(3, 4, G);
  add_edge(3, 0, G);
  add_edge(4, 3, G);
  add_edge(5, 2, G);

  std::vector<int> c(N);
  int num = strong_components
    (G, make_iterator_property_map(c.begin(), get(vertex_index, G), c[0]));

  std::cout << "Total number of components: " << num << std::endl;
  std::vector < int >::iterator i;
  for (i = c.begin(); i != c.end(); ++i)
    std::cout << "Vertex " << i - c.begin()
      << " is in component " << *i << std::endl;
  return EXIT_SUCCESS;
}

【问题讨论】:

  • 我可以只发布所有文档 - 您具体有什么不明白的?这是属性的映射(查找)。例如您可以为边添加名称,或为顶点添加颜色。
  • +1。如果 BGL 对属性映射有一个不错的默认设置,那么 BGL 会更加有用。 STL 作者理解这一点,提供std::less 作为std::map 的默认顺序。
  • @MSalters 很有趣。在这个特定的例子中,你认为什么是体面的默认值?大多数property_maps 的用户都需要他们,这应该如何工作?
  • 将值与对象关联的默认方法是使值成为成员。 IE。 struct Edge { float value; }。如果您需要不止一个值,请提供您自己的struct。与struct RGB { int R; int G; int B; }; std::vector&lt;RGB&gt; 没有什么不同。 BGL 是如此复杂,以至于我认为您应该在 90% 的情况下自行开发,仅在最难的 10% 情况下使用 BGL。将其与 STL 相比,这对于最简单的 90% 的情况就足够了 - 完全相反。
  • @MSalters 这种关联值的方式只在以后的版本中引入,只要你没有一些内省(比如BOOST_FUSION_ADAPT_STRUCT),使用类成员进行元编程是很痛苦的来帮你。我有一些引入默认属性映射的代码,如果你的结构支持它,但它从未进入主分支。共识似乎是让 BGL 保持原样,而不是打破它并重写一段时间(至少已经发生了一次重写,但还达不到 Boost 质量)。

标签: c++ boost boost-graph boost-property-map


【解决方案1】:

PropertyMaps 的核心是数据访问的抽象。泛型编程中很快出现的一个问题是:如何获取与某个对象关联的数据?它可以存储在对象本身中,对象可以是指针,也可以在某个映射结构中位于对象之外。

您当然可以将数据访问封装在函子中,但这很快就会变得乏味,并且您会寻找更窄的解决方案,Boost 中选择的是 PropertyMaps。

请记住,这只是概念。例如,具体实例是 std::map(带有一些语法调整),一个返回键成员的函数(同样,带有一些语法调整)。

对您的编辑:make_iterator_property_map 构建一个 iterator_property_map。第一个参数为偏移计算提供了一个迭代器。第二个参数又是一个 property_map 来进行偏移计算。这共同提供了一种使用vertex_descriptor 根据vertex_descriptor 的索引将数据写入vector 的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2014-02-27
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多