
Hi, I want to store pointers in a graph. Can I somehow use their pointers as indexes? Here's the code I'm trying to execute. It does not work correctly, however; apparently graph add other nodes in the vector storage (to fill the holes?). I suppose I could use listS instead of vecS, but then I can't get the topological_sort code to work (I know I have to provide some form of indices, but I don't understand how to do that). Any suggestions to solve this? Thanks! #include <iostream> #include <boost/graph/graph_traits.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/topological_sort.hpp> class Plugin { public: // some data here int x; Plugin(int a) : x(a) {} }; typedef std::list< std::pair<Plugin *, Plugin *> > EdgeList; typedef boost::adjacency_list<boost::setS, boost::vecS, boost::directedS, Plugin *> PipelineGraph; typedef boost::graph_traits<PipelineGraph>::vertex_descriptor PipelineVertex; void graph(EdgeList edges) { PipelineGraph graph; for (EdgeList::iterator it(edges.begin()); it != edges.end(); it++) { PipelineVertex a(boost::vertex(reinterpret_cast<unsigned long> (it->first), graph)); PipelineVertex b(boost::vertex(reinterpret_cast<unsigned long> (it->second), graph)); boost::add_edge(a, b, graph); } // sort by topology, so we run the plugins in the correct order std::vector<PipelineVertex> sorted; boost::topological_sort(graph, std::back_inserter(sorted)); std::cout << sorted.size() << std::endl; // REVERSE topological order std::vector<PipelineVertex> vl(sorted.rbegin(), sorted.rend()); // loop for (std::vector<PipelineVertex>::iterator it(vl.begin()); it != vl.end(); it++) { Plugin *p = reinterpret_cast<Plugin *>(*it); std::cout << p->x << std::endl; } } int main() { EdgeList edges; Plugin *a = new Plugin(1); Plugin *b = new Plugin(2); Plugin *c = new Plugin(3); Plugin *d = new Plugin(4); edges.push_back(std::pair<Plugin*, Plugin*>(a, b)); edges.push_back(std::pair<Plugin*, Plugin*>(b, c)); edges.push_back(std::pair<Plugin*, Plugin*>(b, d)); graph(edges); return 0; }