STL map: reverse iterator for lower_bound?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • qlin88@gmail.com

    STL map: reverse iterator for lower_bound?

    Hi,

    In STL multi-map, the lower_bound, upper_bound,equ al_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 help.


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

  • =?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=

    #2
    Re: STL map: reverse iterator for lower_bound?

    On 2008-04-03 23:07, qlin88@gmail.co m wrote:
    Hi,
    >
    In STL multi-map, the lower_bound, upper_bound,equ al_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_iterato rs and rend():

    #include <iostream>
    #include <map>

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

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


    std::multimap<i nt, int>::iterator upper = m.upper_bound(4 );
    std::multimap<i nt, int>::reverse_i terator r(upper);

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


    --
    Erik Wikström

    Comment

    • Carl Barron

      #3
      Re: STL map: reverse iterator for lower_bound?

      In article
      <beab93ac-d4ff-441a-8ac3-06702c2ef8ab@d2 1g2000prf.googl egroups.com>,
      <qlin88@gmail.c omwrote:
      Hi,
      >
      In STL multi-map, the lower_bound, upper_bound,equ al_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,i terator>, [or possibly
      pair<const_iter ator,const_iter ator>

      where the range [pair::first,pai r::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++.m oderated. First time posters: Do this! ]

      Comment

      • Jiri Palecek

        #4
        Re: STL map: reverse iterator for lower_bound?

        qlin88@gmail.co m wrote:
        Hi,
        >
        In STL multi-map, the lower_bound, upper_bound,equ al_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_it erator<Iterrev_ it;
        std::for_each(r ev_it(end), rev_it(begin), ...);

        Regards
        Jiri Palecek



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

        Comment

        • Andrew Koenig

          #5
          Re: STL map: reverse iterator for lower_bound?

          <qlin88@gmail.c omwrote in message
          news:beab93ac-d4ff-441a-8ac3-06702c2ef8ab@d2 1g2000prf.googl egroups.com...
          In STL multi-map, the lower_bound, upper_bound,equ al_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++.m oderated. First time posters: Do this! ]

          Comment

          Working...