Boost logo

Boost Users :

From: Lars Kunert (lkunert_at_[hidden])
Date: 2004-09-15 02:47:24


Hi!
I am using a graph with setS as EdgeList template-parameter.

I currently try to implement to get the number of neighbors which two
vertices have in common.
I tried to solve this problem by walking thought both out_edge_iterator -
ranges in parallel.

        tie( i, i_end ) = out_edges( vertex_i, graph );
        tie( j, j_end ) = out_edges( vertex_j, graph );

        int a =0;
        for( ;; )
        {
            if( *i == *j )
            {
                ++i;
                ++j;
                ++a;
 
                if( i == iend ) return a;
                if( j == jend ) return a;
 
            } else if( *i < *j ) { // PROBLEM
 
                ++i;
                if( i == iend ) return a;
 
            } else /* ( *i > *j ) */ {
 
                ++j;
                if( j == jend ) return a;

            };
        };

        return 0;
    };

And get the following error message:

../../../pocket_graph/src/clustering/GraphAssociation.h:147: error: no
match
   for 'operator<' in 'boost::iterator_facade<I, V, TC, R, D>::operator*()

   const [with Derived =

Which basicaly tells me that operator< is not defined for an edge
descriptor.

After digging through some bgl-code I found the class stored_edge (in
detail/adjacency_list.hpp )

    template <class Vertex>
    class stored_edge
      : public boost::equality_comparable1< stored_edge<Vertex>,
        boost::less_than_comparable1< stored_edge<Vertex> > >
    {
    public:
      typedef no_property property_type;
      inline stored_edge() { }
      inline stored_edge(Vertex target, const no_property& =
no_property())
        : m_target(target) { }
      // Need to write this explicitly so stored_edge_property can
      // invoke Base::operator= (at least, for SGI MIPSPro compiler)
      inline stored_edge& operator=(const stored_edge& x) {
        m_target = x.m_target;
        return *this;
      }
      inline Vertex& get_target() const { return m_target; }
      inline const no_property& get_property() const { return s_prop; }
      inline bool operator==(const stored_edge& x) const
        { return m_target == x.get_target(); }
      inline bool operator<(const stored_edge& x) const
        { return m_target < x.get_target(); }
      //protected: need to add hash<> as a friend
      static no_property s_prop;
      // Sometimes target not used as key in the set, and in that case
      // it is ok to change the target.
      mutable Vertex m_target;
    };

for some reason I can not use operator<() or get_target(), but accessing
m_target directly works (cause its mutable???)...

            } else if( i->m_target < j->m_target ) { // SOLUTION ?!

However - I feel a bit uneasy to use such a low level interface... Does
anyone know of a better solution?

Thanks for your help!

Lars


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