Как я могу использовать std :: binary_search, используя только ключ? - PullRequest
5 голосов
/ 13 августа 2010

У меня есть некоторые данные, которые хранятся в отсортированном векторе. Этот вектор отсортирован по некоторому ключу. Я знаю, что в STL есть алгоритм для проверки наличия элемента в этом отсортированном списке. Это означает, что я могу написать что-то вроде этого:

struct MyData { int key; OtherData data; };
struct MyComparator
{
  bool operator()( const MyData & d1, const MyData & d2 ) const
  {
    return d1.key < d2.key;
  }
};

bool isKeyInVector( int key, const std::vector<MyData> &v )
{
   MyData thingToSearchFor;
   thingToSearchFor.key = key;
   return std::binary_search( v.begin(), v.end(), thingToSearchFor, MyComparator() );
}

Однако я считаю конструкцию объекта "thingToSearchFor" не элегантной. Есть ли способ лучше? Что-то похожее на это?

struct MyComparator2
{
  bool operator()( const MyData & d1, const MyData & d2 ) const
  {
    return d1.key < d2.key;
  }
};

bool isKeyInVector2( int key, const std::vector<MyData> &v )
{
   return std::binary_search( v.begin(), v.end(), key, MyComparator2() );
}

1 Ответ

11 голосов
/ 13 августа 2010

Do:

struct MyComparator
{
    bool operator()(int d1, const MyData & d2) const
    {
        return d1 < d2.key;
    }

    bool operator()(const MyData & d1, int d2) const
    {
        return d1.key < d2;
    }
};

Предикат называется как pred(value, ...) или pred(..., value), поэтому просто примите значение напрямую.

...