|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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. Thanks for your . -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On 2008-04-03 23:07, qlin88@gmail.com 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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
In article
<beab93ac-d4ff-441a-8ac3-06702c2ef8ab@d21g2000prf.googlegroups.com>, <qlin88@gmail.com> 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? > well n2521,pdf [mulitmap] states equal_range returns pair<iterator,iterator>, [or possibly pair<const_iterator,const_iterator> where the range [pair::first,pair::second) is the range of equal keys. if your implimentation of multimap returns only an iterator it is not conforming.... -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
qlin88@gmail.com 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! ] |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
<qlin88@gmail.com> wrote in message
news:beab93ac-d4ff-441a-8ac3-06702c2ef8ab@d21g2000prf.googlegroups.com... > 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! ] |
|
![]() |
| Outils de la discussion | |
|
|