# STL map: reverse iterator for lower_bound?

Discussion in 'C++' started by qlin88@gmail.com, Apr 3, 2008.

1. ### Guest

Hi,

In STL multi-map, the lower_bound, upper_bound,equal_range all
return an iterator. Now ifone wants to iterate from an upper bound
towards a lower bound, what would be the best way to do it?

I tried to interate backwards with an iterator, but the begin()
element was not properly included.

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

, Apr 3, 2008

2. ### Erik WikstrÃ¶mGuest

On 2008-04-03 23:07, wrote:
> Hi,
>
> In STL multi-map, the lower_bound, upper_bound,equal_range all
> return an iterator. Now ifone wants to iterate from an upper bound
> towards a lower bound, what would be the best way to do it?
>
> I tried to interate backwards with an iterator, but the begin()
> element was not properly included.

You can use reverse_iterators and rend():

#include <iostream>
#include <map>

int main()
{
std::multimap<int, int> m;
for (int i = 0; i < 10;++i)
{
m.insert(std::make_pair(i, i));
m.insert(std::make_pair(i, 2*i));
}

//for (
std::multimap<int, int>::iterator it = m.begin();
it != m.end();
++it)
// std::cout << it->first << "\t" << it->second << "\n";

std::multimap<int, int>::iterator upper = m.upper_bound(4);
std::multimap<int, int>::reverse_iterator r(upper);

for (;r != m.rend();++r)
std::cout << r->first << "\t" << r->second << "\n";
}

--
Erik WikstrÃ¶m

Erik WikstrÃ¶m, Apr 3, 2008

3. ### Jiri PalecekGuest

wrote:

> Hi,
>
> In STL multi-map, the lower_bound, upper_bound,equal_range all
> return an iterator. Now ifone wants to iterate from an upper bound
> towards a lower bound, what would be the best way to do it?

You can convert any (bidirectional) iterator to its reverse by something
like that:

typedef std::reverse_iterator<Iter> rev_it;
std::for_each(rev_it(end), rev_it(begin), ...);

Regards
Jiri Palecek

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Jiri Palecek, Apr 4, 2008
4. ### Andrew KoenigGuest

<> wrote in message
news:...

> In STL multi-map, the lower_bound, upper_bound,equal_range all
> return an iterator. Now ifone wants to iterate from an upper bound
> towards a lower bound, what would be the best way to do it?

> I tried to interate backwards with an iterator, but the begin()
> element was not properly included.

Rule of thumb: decrement before you use the iterator; increment after you
use it. So:

it = x.begin();
while (it != x.end()) {
// do something with *it
++it;
};

And, going the other way:

it = x.end();
while (it != x.begin()) {
--it;
// do something with *it
}

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Andrew Koenig, Apr 7, 2008