У меня есть std :: vector этой структуры:
struct MS
{
double aT;
double bT;
double cT;
};
, который я хочу чтобы использовать std :: sort, а также std :: lower_bound / equal_range и т. д.
Мне нужно иметь возможность отсортировать его и найти в любом из первых двух элементов структуры. Итак, на данный момент у меня есть следующее:
class MSaTLess
{
public:
bool operator() (const MS &lhs, const MS &rhs) const
{
return TLess(lhs.aT, rhs.aT);
}
bool operator() (const MS &lhs, const double d) const
{
return TLess(lhs.aT, d);
}
bool operator() (const double d, const MS &rhs) const
{
return TLess(d, rhs.aT);
}
private:
bool TLess(const double& d1, const double& d2) const
{
return d1 < d2;
}
};
class MSbTLess
{
public:
bool operator() (const MS &lhs, const MS &rhs) const
{
return TLess(lhs.bT, rhs.bT);
}
bool operator() (const MS &lhs, const double d) const
{
return TLess(lhs.bT, d);
}
bool operator() (const double d, const MS &rhs) const
{
return TLess(d, rhs.bT);
}
private:
bool TLess(const double& d1, const double& d2) const
{
return d1 < d2;
}
};
Это позволяет мне вызывать как std :: sort, так и std :: lower_bound с помощью MSaTLess () для сортировки / поиска на основе элемента aT и с помощью MSbTLess () для сортировки / поиска на основе элемент bT.
Я бы хотел уйти от функторов и использовать вместо них лямбда-выражения C ++ 0x. Для сортировки это относительно просто, поскольку лямбда принимает в качестве аргументов два объекта типа MS.
А как насчет lower_bound и других алгоритмов поиска двоичного поиска? Им нужно иметь возможность вызывать компаратор с аргументами (MS, double), а также наоборот, (double, MS), верно? Как мне лучше всего предоставить им лямбду при вызове lower_bound? Я знаю, что могу создать фиктивный объект MS с поиском необходимого значения ключа, а затем использовать ту же лямбду, что и для std :: sort, но есть ли способ сделать это без использования фиктивных объектов?