假设我有一个图表,每个边都包含一个字符。从顶点开始,我希望获得具有特定字符的特定边缘。由于边缘容器可以设置为集合或散列集,我假设有一种方法可以在不迭代顶点的外边缘的情况下执行此操作。我也假设/希望边缘容器键入边包含的类型。
#include <boost/graph/adjacency_list.hpp>
using namespace boost;
typedef boost::adjacency_list<setS, vecS, directedS, std::string, char> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor Vertex;
typedef boost::graph_traits<MyGraph>::edge_descriptor Edge;
MyGraph g;
//setup
add_vertex(std::string("xxx"), g);
Vertex currentVertex = g.vertex_set()[0];
Vertex endVertex = add_vertex(std::string("yyy"), g);
add_edge(currentVertex, endVertex, 'i', g);
//later...
//Now I want that edge containing the letter 'i'.
//out_edges returns a pair of edge iterators.
std::pair<iterator, iterator> iterators = out_edges(currentVertex, g); // do not want!
Edge iEdge = how_do_I_get_This?(currentVertex, g); // want!
有没有办法做到这一点,或者是在外边缘迭代唯一的选择?
更新
我认为这会让我成为容器。
std::set<?> edges = g.out_edge_list(currentVertex);
现在我无法弄清楚是什么?模板类型是。
UPDATE2:
这似乎是编译,但我需要一个edge_descriptor,而不是edge_property来传递给目标。
std::set<boost::detail::stored_edge_property<long unsigned int, char> > edges = fGraph.out_edge_list(currentVertex);
UPDATE3:
猜猜我不需要边缘描述符。得到了我需要的东西:
std::set<boost::detail::stored_edge_property<long unsigned int, char> > edges = fGraph.out_edge_list(currentVertex);
std::_Rb_tree_const_iterator<boost::detail::stored_edge_property<long unsigned int, char> > edge = edges.find(*i);
Vertex target = edge.get_target();
这一切都编译并且似乎有效,但它非常丑陋。
答案 0 :(得分:1)
您在寻找如何使用边缘描述符吗?
Edge i_edge = add_edge(currentVertex, endVertex, 'i', g).first;
i_edge
是'i'
边缘的顶点描述符。
// later...
// Now I want that edge containing the letter 'i'.
char yougotit = g[i_edge];
检查:
assert('i' == yougotit);
如果您真的想要搜索,并且可以使用c ++ 1y,您可能会发现这种优雅: Also Live
#include <boost/graph/adjacency_list.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <iostream>
using namespace boost::adaptors;
using namespace boost;
typedef boost::adjacency_list<setS, vecS, directedS, std::string, char> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor Vertex;
typedef boost::graph_traits<MyGraph>::edge_descriptor Edge;
int main() {
MyGraph g;
// setup
add_vertex(std::string("xxx"), g);
Vertex currentVertex = g.vertex_set()[0];
Vertex endVertex = add_vertex(std::string("yyy"), g);
add_edge(currentVertex, endVertex, 'i', g);
for (auto matching : boost::edges(g) | filtered([&g](auto const& e) { return g[e] == 'i'; }))
std::cout << matching << " --> " << g[matching] << "\n";
}
输出:
(0,1) --> i