views:

42

answers:

1

I have some data that is stored in a sorted vector. This vector is sorted by some key. I know the STL has an algorithm for checking if an element is in this sorted list. This means I can write something like this:

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() );
}

However I find the construction of the "thingToSearchFor" object inelegant. Is there a better way? Something similar to this?

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() );
}
+4  A: 

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;
    }
};

The predicate is called like pred(value, ...) or pred(..., value), so just take in the value directly.

GMan
This seems to work, but seems to violate the requirement that the predicate be a Strict Weak Ordering. In particular from the SGI STL site "Second argument type: The type of the Strict Weak Ordering's second argument. The first argument type and second argument type must be the same."
Michael Anderson
@Michael: I don't see any such requirements in the C++ standard, looking at §25.3. SGI != Standard Library.
GMan
@GMan: I also can find no mention of this in the standard. Looks like this is the way to do it.
Michael Anderson