|
Boost Users : |
From: David Pearce (djp1_at_[hidden])
Date: 2003-05-02 08:38:01
Hello,
I am interested in how boosters think online graph algorithms should
be written. I have looked at the connected_components algorithm and
feel that it breaks some of the ideas behind generic programming. For
example, consider the following:
> typedef adjacency_list <vecS, vecS, undirectedS> Graph;
> Graph G(6);
> add_edge(0, 1, G);
> add_edge(1, 4, G);
>
> // create the disjoint-sets structure, which requires
> // rank and parent vertex properties
> ...
> initialize_incremental_components(G, ds);
> incremental_components(G, ds);
>
> generic_algorithm_which_adds_edges(G);
At this point, the connected_components data structures may be
out-of-sync. Now, I suppose that we could write a wrapper class which
looked like a "Graph" and provides its own add_edge to update "ds"
correctly. However, this seems overly cumbersome.
It strikes me that a better way of doing this would be to use an
abstract base class, like so:
> template<class T, ...>
> class connected_components : public T {
> ...
> };
>
> template<class T>
> pair<T::edge_descriptor, bool>
> add_edge(connected_components<T>::vertex_descriptor t, ...) {
> // do stuff
> return add_edge(static_cast<T::vertex_descriptor>(t), ...);
> }
Thus, we supply "Graph" as the base class and can then safely pass it
to "generic_algorithm_which...".
So, does anyone know of any reasons not to do this?
Cheers,
David J. Pearce
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