Boost logo

Boost Users :

Subject: [Boost-users] Help on creating a custom InputIterator for boost graph adjacency_list()
From: Cedric Laczny (cedric.laczny_at_[hidden])
Date: 2010-05-19 03:19:50


Hi,

I have a graph with quite some information stored in its vertices and edges.
Now I would like to perform some analyses on the general overall topology of
the graph. Therefore I don't need this "big graph" but only a graph that has
the same number of nodes and matching edges to the "big graph".
To this end, I wanted to use the adjacency_list() constructor together with an
EdgeIterator that models the InputIterator so the routines of the boost-graph
library would take care of creating the new "simple graph", which indeed would
be a nice solution.
However, I just don't get it how to program an EdgeIterator with the following
constraints (taken from
http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/adjacency_list.html):
The EdgeIterator must be a model of InputIterator. The value type of the
EdgeIterator must be a std::pair, where the type in the pair is an integer
type.
Here's what I experimented with so far:

<--- Code --->
template< class EdgeIterator, class Edge >
class MyEdgeIterator// : public input_iterator< std::pair<int, int> >
{
public:
        MyEdgeIterator() {};

        MyEdgeIterator(EdgeIterator& rhs) : actual_edge_it_(rhs) {};

        MyEdgeIterator(const MyEdgeIterator& to_copy) {};

        bool operator==(const MyEdgeIterator& to_compare)
        {
                return actual_edge_it_ == to_compare.actual_edge_it_;
        }

        bool operator!=(const MyEdgeIterator& to_compare)
        {
                return !(*this == to_compare);
        }

        Edge operator*() const
        {
                return *actual_edge_it_;
        }

        const MyEdgeIterator* operator->() const;
        MyEdgeIterator& operator ++()
        {
                ++actual_edge_it_;
                return *this;
        }

        MyEdgeIterator operator ++(int)
        {
                MyEdgeIterator<EdgeIterator, Edge> tmp = *this;
                ++*this;
                return tmp;
        }

private:
        EdgeIterator& actual_edge_it_;
}
<--- Code-End --->

Especially, I'm having trouble with the fact that the EdgeIterator must return
a pair of the vertex indices that the actual edge "points to".
I think that this must include something like get(vertex_index_t,
adjacency_list(...), source(*EdgeIterator, adjacency_list(...)). But this
would mean that e.g. MyEdgeIterator would additionally need the vertex-
property map of vetex indices. This seems a bit too much information packed
into this one, small iterator.
Thank you.

Best regards,

Cedric



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net