question about std::distance

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


Found my alternate implement via:
   typedef map<vector EdgeData> > Edges.
Would really like to know if I found a big bug in sgi stl or my bug, 
probably in my compare functor.

Jeffrey Holle wrote:
> 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