Search code examples
c++booststlpredicatestd-pair

How do I create a set with std::pair thats sorted based on the ::second pair member using bind


I know I could use the following:

template <typename Pair> 
struct ComparePairThroughSecond : public std::unary_function<Pair, bool>
{ 
    bool operator ()(const Pair& p1, const Pair& p2) const
    {  
        return p1.second < p2.second; 
    } 
};

std::set<std::pair<int, long>, ComparePairThroughSecond> somevar;

but wondered if it could be done with boost::bind


Solution

  • How about the following one. I'm using boost::function to 'erase' the actual type of the comparator. The comparator is created using boost:bind itself.

      typedef std::pair<int, int> IntPair;
      typedef boost::function<bool (const IntPair &, const IntPair &)> Comparator;
      Comparator c = boost::bind(&IntPair::second, _1) < boost::bind(&IntPair::second, _2);
      std::set<IntPair, Comparator> s(c);
    
      s.insert(IntPair(5,6));
      s.insert(IntPair(3,4));
      s.insert(IntPair(1,2));
      BOOST_FOREACH(IntPair const & p, s)
      {
        std::cout << p.second;
      }