'How to find the first smaller element than an integer X in a vector ? (c++)
If I have the following vector {10 10 10 20 20 20 30 30}
and I want a function to return the position of the integer that = X or directly the smaller element after X , like for example if I am searching for 11 I want the function to return 2 since the 2nd element(10) is the first smaller element than 11 in the vector.
I tried using lower_bound but that doesn't work.
int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
vector<int>::iterator low,up;
sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
low=lower_bound (v.begin(), v.end(), 11); //
up= upper_bound (v.begin(), v.end(), 11); //
cout << "lower_bound at position " << int(low- v.begin()) << endl;
cout << "upper_bound at position " << int(up - v.begin()) << endl;
return 0;
this code outputs:
lower_bound at position 3
upper_bound at position 3
Solution 1:[1]
Well, upper_bound returns the first item that is greater than the test item, so the one before that (if it exists) will be the one you want?
Solution 2:[2]
you could do this...it might be better to return an iterator in case if the vector is empty...
auto find_next_smaller(vector<int> vec, const int x) {
std::sort(vec.begin(), vec.end());
auto it = std::lower_bound(vec.begin(), vec.end(), x);
if (it == vec.end()) {
it = (vec.rbegin()+1).base();
}
else if (it != vec.begin() && *it > x) {
--it;
}
return it;
}
Solution 3:[3]
If one has to find an element less than or equal to some x then multiset can be used to do so.
#include <iostream>
#include <set>
#include <iterator>
using namespace std;
int main()
{
multiset <int, greater <int> > iammultiset;
iammultiset.insert(10);
iammultiset.insert(10);
iammultiset.insert(14);
iammultiset.insert(20);
iammultiset.insert(20);
iammultiset.insert(30);
iammultiset.insert(40);
iammultiset.insert(50);
//{10,10,14,20,20,30,40,50}
cout<<*iammultiset.lower_bound(17) << endl;
//The Output here will be 14.
cout<<*iammultiset.lower_bound(20) << endl;
//The Output here will be 20.
}
Solution 4:[4]
#include <bits/stdc++.h>
using namespace std;
template <typename F, typename T>
F first_less_than(F f, F l, T val)
{
auto it = lower_bound(f, l, val);
return it == f ? l : --it;
}
int main()
{
vector<int> s{10, 20, 25, 40};
auto j = first_less_than(s.begin(), s.end(), 35);
cout << *j;
//output : 25
return 0;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Ajay |
| Solution 2 | Gerald |
| Solution 3 | joshi |
| Solution 4 | Tyler2P |
