How to use lower_bound(upper_bound) to find position of any number in array?
Asked Answered
S

1

8

For example, I have an array with elements 1,7,9,23,34,47,67,89,123,234,345,567. I need to know the position of 123.

Show answered 17/11, 2016 at 17:51 Comment(6)
std::find Ought to work just fine. You can subtract std::begin(array) to get an (numerical) index rather than an iterator if that's what you need.Justifier
Have you tried anything? please provide a Minimal, Complete, and Verifiable exampleOsbourne
@Justifier with std::find you have the same problem. The function returns that iterator, not the position. So you still have to do the calculation in User_Targaryen's answer.Cobham
@George, I think that the OP provided a complete minimal example (it doesn't look like they've edited it since your comment either).Cobham
@Cobham All I can see is "For example, I have an array with elements 1,7,9,23,34,47,67,89,123,234,345,567. I need to know the position of 123.". The sequence bit doesn't count, it needs to be a code example, a C++ code example really from the tag.Osbourne
Together with the title of the question, it seems pretty explicit: std::lower_bound on an array to get the index instead of the element. Sure, the OP's question could be a bit better, but not enough to require revision.Cobham
Z
9

Declare and initialize the array with the elements. Then create a vector of ints. Use upper_bound() on the vector. Here is an example:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main() {
    int arr[] = {1,7,9,23,34,47,67,89,123,234,345,567};
    int len = sizeof(arr)/sizeof(arr[0]);
    vector<int> v(arr,arr+len);

    vector<int>::iterator upper;
    upper = upper_bound(v.begin(), v.end(), 123);
    cout<<(upper-v.begin())<<endl;  // Output: 9

    return 0;
}

Hope it helps!!

Zeus answered 17/11, 2016 at 18:20 Comment(3)
You can use std::upper_bound and std::lower_bound directly on the array. There's no need for that vector.Amputee
std::upper returns the first value greater than the sought one. If, for instance, you had sought for value 122 you would still get position 9 (or rather, 8), even though the value you looked for wasn't found.Tugman
@Cobham No, it's actually as I wrote it. Have a look: en.cppreference.com/w/cpp/algorithm/upper_bound You're thinking of std::lower_bound which returns an iterator to either the value you're looking for or the one preceding it. For both std::lower_bound and std::upper_bound end() is returned if no suitable value could be found.Tugman

© 2022 - 2024 — McMap. All rights reserved.