Boost logo

Boost Users :

From: Chris Goller (cgoller_at_[hidden])
Date: 2004-11-18 17:21:06


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