【发布时间】: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<RGB>没有什么不同。 BGL 是如此复杂,以至于我认为您应该在 90% 的情况下自行开发,仅在最难的 10% 情况下使用 BGL。将其与 STL 相比,这对于最简单的 90% 的情况就足够了 - 完全相反。 -
@MSalters 这种关联值的方式只在以后的版本中引入,只要你没有一些内省(比如
BOOST_FUSION_ADAPT_STRUCT),使用类成员进行元编程是很痛苦的来帮你。我有一些引入默认属性映射的代码,如果你的结构支持它,但它从未进入主分支。共识似乎是让 BGL 保持原样,而不是打破它并重写一段时间(至少已经发生了一次重写,但还达不到 Boost 质量)。
标签: c++ boost boost-graph boost-property-map