anajin's blog

By anajin, 10 years ago, In English

I search it in google , but i can't find it. Can somebody tell me how to use lower_bound in set<pair<int,int>> , so i can find the fist pair whose first element is not small than the element i search for ?

  • Vote: I like it
  • +3
  • Vote: I do not like it

| Write comment?
»
10 years ago, # |
  Vote: I like it +35 Vote: I do not like it

x.lower_bound({first, -inf});

  • »
    »
    10 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    got it! Thanks.

  • »
    »
    10 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Could you explain the reasoning behind using that ? Also could you tell how you would do it for upper_bound ? Thanks :)

    • »
      »
      »
      10 years ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      x.upper_bound({first, inf});

    • »
      »
      »
      7 years ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      In these implementations we only care about the first value.

      pair<int,int> will compare the first int first, then the second int. We want ALL second integers to work

      As for upperbound Na2a uses {first, inf} because we want the value to be greater than first, and {first, inf} is the highest pair with first as its first value. (again, we only care about the first value)

  • »
    »
    6 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    How to get the index of that pair,i mean we can't do this:x.lower_bound({first,-inf})-x.begin()?

»
10 years ago, # |
  Vote: I like it -18 Vote: I do not like it

This is a pretty good site : http://bit.ly/1DMMnub

»
5 years ago, # |
  Vote: I like it 0 Vote: I do not like it

How can i call lower_bound on pair<int,int> to get the last occurence of pair if element is repeating ?

For eg :

[7,1,5,3,1,1]

[ {1,1,} , {1,4} , {1,5}, {3,3}, {5,2}, {7,0} ]

if i do lower_bound for should get pair {1,5}

  • »
    »
    5 years ago, # ^ |
    Rev. 2   Vote: I like it +11 Vote: I do not like it

    try auto it = st. upper_bound({first+1,-inf})
    if(it == st.begin()) element not found
    else element in it--

    • »
      »
      »
      5 years ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      can u explain more ?

      • »
        »
        »
        »
        5 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        upper bound return an iterator that points to the first element strictly bigger than {x,y}
        st. upper_bound({first+1,-inf}) return an iterator to the first element strictly bigger than the element we are looking for
        for example :

        [ {1,1,} , {1,4} , {1,5}, {3,3}, {5,2}, {7,0} ]
        auto it = st. upper_bound({2,-inf})
        *it = {3,3}
        so to get {1,5} all we need to do is it--;
        A corner case is :
        [ {3,3}, {5,2}, {7,0} ]
        auto it = st. upper_bound({2,-inf})
        *it = {3,3} (it = st.begin())
        in this case it-- is not defined so this will cause a runtime error
        tha's why we need to test if (it == st.begin())
        PS : in our case lower_bound will give the same result as we are sure that no pair have the second element equals -inf so stricly bigger ( < ) or stricly bigger or equal ( <= ) gives the same result

»
5 years ago, # |
  Vote: I like it -13 Vote: I do not like it

you can do it this way : s.lower_bound(make_pair(x, y)) or s.lower_bound(pair(x, y)). (the last case just in c++17).