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

C++ BOOST中的属性映射是什么?,c++,boost,boost-graph,boost-property-map,C++,Boost,Boost Graph,Boost Property Map,有人能向像我这样的Boost初学者解释一下Boost中的属性映射是什么吗? 我在尝试使用BGL计算强连接组件时遇到了这个问题。 我扔掉了属性映射和图形模块的文档,但仍然不知道如何利用它。 以这段代码为例: -make_iterator_property_map函数在做什么? -这段代码的含义是什么:get(顶点索引,G) #包括 #包括 #包括 #包括 #包括 int main() { 使用名称空间boost; typedef邻接列表图形; 常数int N=6; 图G(N); 添加_边(0,1,

有人能向像我这样的Boost初学者解释一下Boost中的属性映射是什么吗? 我在尝试使用BGL计算强连接组件时遇到了这个问题。 我扔掉了属性映射和图形模块的文档,但仍然不知道如何利用它。 以这段代码为例: -make_iterator_property_map函数在做什么? -这段代码的含义是什么:get(顶点索引,G)

#包括
#包括
#包括
#包括
#包括
int
main()
{
使用名称空间boost;
typedef邻接列表图形;
常数int N=6;
图G(N);
添加_边(0,1,G);
添加_边(1,1,G);
添加_边(1,3,G);
添加_边(1,4,G);
添加_边(3,4,G);
添加_边(3,0,G);
添加_边(4,3,G);
添加_边(5,2,G);
std::向量c(N);
int num=强分量
(G,make_iterator_property_map(c.begin(),get(vertex_index,G),c[0]);

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

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

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


对于您的编辑:
make_iterator_property_map
构建一个。第一个参数提供了一个迭代器作为偏移计算的基础。第二个参数也是一个属性映射,用于进行偏移计算。这提供了一种使用
顶点描述符
的方法,基于i
vertex\u描述符的ndex

我可以发布所有文档-您不明白的具体内容是什么?这是一个地图(查找)对于属性,例如,可以将名称添加到边缘,或者将颜色添加到顶点。+ 1。如果BGL对于属性映射有一个像样的默认值,则更有用。STL作者理解这一点,提供<代码> STD::<<代码> >作为默认代码,用于<代码> STD::MAP。示例?对于大多数
property_映射
用户需要掌握它们,这在这里应该如何工作?将值与对象关联的默认方法是将值设为成员。即
struct Edge{float value;}
。如果您需要多个值,请提供您自己的
struct
。与
struct RGB{int R;int G;int B;}没有什么区别;std::vector
。BGL非常复杂,我认为您应该在90%的情况下使用自己的BGL,仅在最难的10%情况下使用BGL。与STL相比,STL对于最简单的90%情况来说就足够了,完全相反。@msalter这种关联值的方法只有在更高版本和clas的元编程中引入只要你没有内省(比如
BOOST\u FUSION\u ADAPT\u STRUCT
),s的成员就会很痛苦为了帮助您,我有一些代码引入了默认属性映射,如果您的结构支持的话,但它从未进入主分支。共识似乎是让BGL保持原样,而不是打破它,并在某个时候进行重写(至少已经发生了一次重写,但无法提高质量)。
#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;
}