有人可以向像我这样的 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/