Цель сравнения не обязательно должна быть того же типа, что и содержимое контейнера, она просто должна быть чем-то, что вы можете сравнить с контейнером:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
int i = *(lower_bound(v.begin(), v.end(), 1.5)); // <<< NOTE: floating point "value"
cout << i << endl;
}
Ваше предположение, что вам нужно сделать что-то вроде Base
, неверно.Вы можете определить BaseKey
, который подходит для ваших сравнений, если ваш явный (или подразумеваемый) оператор сравнения знает, что делать.
Комментарий ниже также неверен, поскольку этот более сложный пример демонстрирует:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct A {
int x;
A(int _x) :x(_x) { }
bool operator < (double d) { return x < d; }
};
int main()
{
vector<A> v;
v.push_back(A(1));
v.push_back(A(2));
v.push_back(A(3));
int i = (lower_bound(v.begin(), v.end(), 1.5))->x;
cout << i << endl;
}
Вы также можете явно использовать тип сравнения (что помогает при проблемах с порядком операций, которые могут возникнуть при upper_bound
):
class CompareADouble {
public:
bool operator () (const double d, A& a) { return d < a.x; }
};
int main()
{
vector<A> v;
v.push_back(A(1));
v.push_back(A(2));
v.push_back(A(3));
int i = (upper_bound(v.begin(), v.end(), 1.5, CompareADouble()))->x;
cout << i << endl;
}
A binary_search
пример, обеспечивающийоба сравнения с полиморфизмом:
class CompareADouble {
public:
bool operator () (const double d, A& a) { return d < a.x; }
bool operator () (A& a, const double d) { return a.x < d; }
};
...
bool exists = binary_search(v.begin(), v.end(), 1.5, CompareADouble());
cout << exists << endl; // false
exists = binary_search(v.begin(), v.end(), 1.0, CompareADouble());
cout << exists << endl; // true because 1.0 < 1 == false && 1 < 1.0 == false