question about std::distance

Jeffrey Holle jeff.holle@verizon.net
Mon Sep 20 00:49:00 GMT 2004


On further investigation, it appears that the problem that I'm having is 
related to my ltEdgeDescriptor functor.  In calling either .count or 
distance, this functor is called forever. It has been used before, but 
only with map.  It appears to be at least intolerant of duplicates.
There it is:
struct ltEdgeDescriptor : public 
std::binary_function<DataEdge,DataEdge,bool>
{
   bool operator() (const DataEdge& s1, const DataEdge& s2) const
   {
     return s1.m_source<s2.m_source || (!(s1.m_source<s2.m_source) && 
s1.m_target<s2.m_target);
   }
};

I copied this pattern from stl_pair.h, so I thought I was safe.
Can someone point out the problem here and hopefully sugguest an 
alternate implementation?



Jeffrey Holle wrote:
> I'm using gcc v3.4.2.
> 
> For the first time, I'm attempting to use std::distance and std::advance 
> and am having trouble with at least std::distance.
> 
> Basically, I'm trying to deal with duplicates.
> In the following code, I want to iterate thru just the non-duplicates.
> In my test case, edges has a size of 47 and there are two sets of 4 
> duplicates each.  So I want the for loop to execute 41 times.
> 
> typedef std::multiset<DataEdge,ltEdgeDescritor> Edges;
> Edges edges;
> 
> <populate edges>
> 
> for(Edges::iterator iter=edges.begin();
>                     iter!=edges.end(); 
> advance(iter,distance(edges.lower_bound(*iter),edges.upper_bound(*iter)))
> {
> .....
> }
> 
> What I find is that my program enters distance and doesn't leave.
> 
> Am I somehow misusing distance?
> 
> Can someone sugguest an alternate method for me to accomplish what I'm 
> trying to do?
> 
> 



More information about the Gcc-help mailing list