лямбда-выражения C ++ для std :: sort и std :: lower_bound / equal_range в элементе структуры в отсортированном векторе of Structs

У меня есть 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, но есть ли способ сделать это без использования фиктивных объектов?

8
задан Paul Caheny 24 November 2010 в 16:08
поделиться