c++ - BOOST 中的属性映射是什么?

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

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

  • 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;
}

最佳答案

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

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

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

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

关于c++ - BOOST 中的属性映射是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325920/

相关文章:

c++ - 在列表中正确使用 boost::shared_ptr

c++ - QwebEnginePage不打印html代码Qt

c++ - boost : Error : 2 overloads have similar conversions

c++ - 我需要一个用于 boost::ublas 矩阵的虚拟析构函数吗?

c++ - 如何记录从源顶点到目的顶点的所有最短路径

c++ - boost::graph 自定义权重类型:numeric_limits 必要吗?

c++ - 使用 ESP8266 自动检测本地服务器

c# - 在 C# 中定义 C++ 类型

python - boost python C4244 警告

C++ Boost 图形库 : Building a vector of vertices visited in an undirected graph search?