lundi 9 septembre 2019

How to access edge information in Boost Graph?

The main question:

I am able to create a graph implementation with information structs assigned to the vertices and edges:

struct vertex_info {std::string name;};
struct edge_info {std::string name;};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_info, edge_info> UndirectedGraph;

For a given graph instance g, I can easily iterate over the vertices, and access their information:

for(size_t i=0; i<boost::num_vertices(g); i++){
  std::cout << g[i].name << std::endl;
}

but I am unable to figure out how to do the same for the edges. I have come across some iterators to loop over all the edges, but I cannot access these edges as some kind of object or something with properties.

A minimal working demonstration:

#include <iostream>
#include <utility>
#include <vector>
#include <string>

#include "boost/graph/graph_traits.hpp"
#include "boost/graph/adjacency_list.hpp"

int main(int argc, char *argv[])
{

  //Add vertex information struct
  struct vertex_info {
    std::string name;
  };

  //Add edge information struct
  struct edge_info {
    std::string name;
  };

  //Typedef my graph implimentation
  typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_info, edge_info> UndirectedGraph;

  //Our set of edges, and count N: (0-7) and 8
  enum {C, D, G, I, S, J, L, H, N};
  const char *name = "CDGISJLH";

  //Create a vector of edges
  typedef std::pair<int, int> Edge;
  std::vector<Edge> edgeVec;
  edgeVec.push_back(Edge(C,D));
  edgeVec.push_back(Edge(D,G));
  edgeVec.push_back(Edge(I,G));
  edgeVec.push_back(Edge(G,L));
  edgeVec.push_back(Edge(H,G));
  edgeVec.push_back(Edge(I,S));
  edgeVec.push_back(Edge(S,J));
  edgeVec.push_back(Edge(L,J));
  edgeVec.push_back(Edge(H,J));

  //Now we can initialize our graph using iterators from our above vector
  UndirectedGraph g(edgeVec.begin(), edgeVec.end(), N);

  std::cout << num_edges(g) << "\n";  //Outputs: 9

  //loop over vertices, access "name" property
  for(size_t i=0; i<boost::num_vertices(g); i++){
    //And add information to the edges
    g[i].name = "foo";
  }

  //We can access the first vertice and print the property
  std::cout << g[0].name << std::endl; //Outputs: foo

  //Edge iterator for or graph
  typedef boost::graph_traits<UndirectedGraph>::edge_iterator edge_iterator;

  //Iterate through all the edges
  std::pair<edge_iterator, edge_iterator> ei = boost::edges(g);
  for(edge_iterator edge_iter = ei.first; edge_iter != ei.second; ++edge_iter) {
   //How can I access the edge property???

  }
}

Aucun commentaire:

Enregistrer un commentaire