Boost Graph Library:如何使用depth_first_visit,ColorMap的问题
Boost Graph Library: How to use depth_first_visit, issue with ColorMap
初始问题:提升图形库:防止DFS访问未连接的节点
我正在尝试使用 boost::d epth_first_visit,但不知道如何提供 ColorMap 属性。我尝试了此处示例中给出的方法:http://www.boost.org/doc/libs/1_58_0/libs/graph/example/loops_dfs.cpp
我的(相关)代码:
/// Define vertex properties.
struct NodeProperty
{
unsigned id; /// Id.
unsigned kind; /// Kind.
unsigned depth; /// Depth.
unsigned layer_color; /// Layer color.
unsigned signal_color; /// Signal color.
unsigned sch_color; /// Sch color.
CBoundingBox bounds; /// Bounds.
NodeProperty()
: id(0), kind(0), depth(0), layer_color(0), signal_color(0), sch_color(0), bounds(0,0,0,0)
{
;
}
};
/// Define net topology graph.
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, NodeProperty> Graph;
/// Define Vertex + iterator.
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef boost::graph_traits<Graph>::vertex_iterator VertexItr;
/// Define Edge + iterator.
typedef boost::graph_traits<Graph>::edge_descriptor Edge;
typedef boost::graph_traits<Graph>::edge_iterator EdgeItr;
class receiver_visitor : public boost::default_dfs_visitor
{
public:
receiver_visitor(std::vector<Vertex>& r)
: recv(r)
{
;
}
void discover_vertex(Vertex v, Graph const& g) const
{
std::cout << "Visit: " << v << std::endl;
if (g[v].sch_color) {
recv.push_back(g[v].sch_color);
}
}
std::vector<Vertex>& recv;
};
std::vector<std::size_t>
NetTopology::getReceivers(std::size_t src) const
{
std::vector<Vertex> recv;
receiver_visitor vis(recv);
std::vector<boost::default_color_type> color_map(boost::num_vertices(data_->g));
//boost::depth_first_search(data_->g, boost::visitor(vis).root_vertex(src));
boost::depth_first_visit(data_->g,
src,
boost::visitor(vis),
boost::make_iterator_property_map(color_map.begin(), boost::get(boost::vertex_index, data_->g), color_map[0]));
return recv;
}
我收到编译错误,我不知道如何解决。有什么想法吗?
/p/dt/cad/em64t_SLES11/boost/1.58.0_gcc472_64/include/boost/graph/depth_first_search.hpp: In instantiation of 'void boost::depth_first_visit(const IncidenceGraph&, typen
ame boost::graph_traits<Graph>::vertex_descriptor, DFSVisitor, ColorMap) [with IncidenceGraph = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, tr
on::les::NodeProperty>; DFSVisitor = boost::bgl_named_params<tron::les::receiver_visitor, boost::graph_visitor_t, boost::no_property>; ColorMap = boost::iterator_propert
y_map<__gnu_cxx::__normal_iterator<boost::default_color_type*, std::vector<boost::default_color_type> >, boost::vec_adj_list_vertex_id_map<tron::les::NodeProperty, long
unsigned int>, boost::default_color_type, boost::default_color_type&>; typename boost::graph_traits<Graph>::vertex_descriptor = long unsigned int]':
NetTopology.cpp:353:139: required from here
/p/dt/cad/em64t_SLES11/boost/1.58.0_gcc472_64/include/boost/graph/depth_first_search.hpp:341:5: error: 'struct boost::bgl_named_params<tron::les::receiver_visitor, boost
::graph_visitor_t, boost::no_property>' has no member named 'start_vertex'
vis.start_vertex(u, g);
您最初使用的depth_first_search
的重载是:
template <class Graph, class class P, class T, class R>
void depth_first_search(Graph& G,
const bgl_named_params<P, T, R>& params);
而你想用于depth_first_visit
的那个是:
template <class IncidenceGraph, class DFSVisitor, class ColorMap>
void depth_first_visit(IncidenceGraph& g,
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
DFSVisitor& vis, ColorMap color);
第一个使用Named Parameters
,因此您需要使用boost::visitor(vis).root_vertex(src)
(如果您想使用默认的起始顶点,则需要使用boost::root_vertex(src).visitor(vis)
或仅boost::visitor(vis)
)。由于depth_first_visit
不使用它们,因此您需要删除对boost::visitor(...)
的调用并直接传递vis
:
boost::depth_first_visit(data_->g,
src,
vis,
boost::make_iterator_property_map(color_map.begin(), boost::get(boost::vertex_index, data_->g), color_map[0]));
相关文章:
- std::visit无法识别类型
- 在c++队列中使用pop和visit实现线程安全
- C++算法标头中,为什么要使用 "!(val < *first)" ?
- std::visit and std::variant usage
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 在 std::visit 中跳过变体类型的一些重载组合的方法是什么?
- 在继承自 std::variant 的类上使用 std::visit——libstdc++ 与 libc++
- 为什么 std::d istance() 对于 std:list:<int>:itrator 在 last 在 first 之前时不返回负数?
- 为什么我们需要在 Visitor 模式中 accept(),为什么我们不能直接调用 visitor.visit()?
- 使用 std::visit与可变参数模板结构
- c std :: vector迭代器构造函数,first == last
- 如何声明pair<int,int>::first
- 自动,错误:MAP ITERATOR没有名为“ First”的成员
- "Node<T*> *first"和"Node<T> *first"有什么区别?
- 为什么 std::find_if(first, last, p) 不通过引用获取谓词?
- 我怎样才能保持'first'和'second'用结构替换 std::p air?
- 从 iterator.first 获取价值
- 为什么在std::overload而不是concepts/constexpr如果在std::visit中?
- 使用 Qt 创建器时出错:"multiple definition" "first defined here"