Boost logo

Boost Users :

From: Jeffrey Holle (jeff.holle_at_[hidden])
Date: 2004-11-18 17:57:54


I believe you could make your loop cleaner by using std::advance and
std::count. Something like:
   multimap<string,string> MyMap;
   for (MyMap::iterator dir=filesystem.begin();
        dir!=filesystem.end();
        advance(dir,filesystem.count(*dir))) {
   }

Chris Goller wrote:
> David-
>
> Thanks.
>
> Upon reading my poorly phrased email I realized this:
>
> I want unique keys so that if the data looks like this:
>
> key value
> 3 1
> 1 2
> 1 4
> 4 3
> 5 5
> 5 9
>
> So, what I would like to do is to a print each value for a particular
> key in such a way:
>
> key: value:
> 1----
> |------2
> |------4
> 3----
> |------1
> 4----
> |------3
> 5----
> |------5
> |------9
>
>
> Or, for example, if I had a list of directories as keys and and files
> are their values then for each directory I could print out the file.
> Right now, I do this:
>
> for (multimap<string, string>::iterator dir = filesystem.begin(); i !=
> filesystem.end())
> {
> pair<multimap<string, string>::iterator, multimap<string,
> string>::iterator> bounds;
> bounds = filesystem.equal_range(dir->first);
> cout << dir->first << "----" << endl;
> for (multimap<string, string>::iterator file = bounds.first; file !=
> bounds.second; file++)
> {
> cout << " |------" << file->second << endl;
> }
> // Moves the directory iterator to the next directory key.
> dir = file;
> }
>
>
> So, I'm trying to get better at using iterators much smarter. I would
> like to make this code much more concise.
>
> I figured that if I could jump from key to key I write the above code
> much cleaner.
>
> Thanks,
>
> Chris
>
>
> David Abrahams wrote:
>
>> Chris Goller <cgoller_at_[hidden]> writes:
>>
>>
>>
>>> I'm just getting into boost and I really like it.
>>>
>>> I would like to iterate over keys of a multimap.
>>>
>>> so it would look like this:
>>>
>>>
>>> std::multimap<type, type>::key_iterator i = map.beginkey(); i !=
>>> map.endkey(); i++
>>> at each i++ it would move to the next key.
>>>
>>> -or-
>>>
>>> for_each(map.beginkey(), map.endkey(), whatever);
>>>
>>>
>>> Is this possible with the boost iterators?
>>>
>>
>>
>> You can't use that syntax, because there's no way to inject a
>> key_iterator member into std::multimap. You could use a
>> transform_iterator over the multimap's native iterator with select1st,
>> defined as:
>>
>> struct select1st
>> {
>> template <class T, class U>
>> T& operator()(std::pair<T,U>& p) const
>> { return p.first }
>>
>> template <class T, class U>
>> T const& operator()(std::pair<T,U> const& p) const
>> { return p.first }
>> };
>>
>> HTH,
>>
>>


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