如何创建一个具有std :: pair的集合,该集合使用bind基于:: second对成员进行排序

时间:2010-06-02 13:40:24

标签: c++ boost stl predicate std-pair

我知道我可以使用以下内容:

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;

但是想知道是否可以使用boost :: bind

完成

2 个答案:

答案 0 :(得分:3)

下一个怎么样?我正在使用boost :: function来“擦除”比较器的实际类型。比较器使用boost:bind本身创建。

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

答案 1 :(得分:0)

问题在于 - 除非您将代码编写为模板或使用C ++ 0x功能 - 您必须命名boost :: bind表达式的类型。但这些类型通常都有非常复杂的名称。

C ++ 98中的模板参数推导:

template<class Fun>
void main_main(Fun fun) {
   set<pair<int,long>,Fun> s (fun);
   …
}

int main() {
   main_main(…boost::bind(…)…);
}

使用C ++ 0x中的auto和decltype:

int main() {
   auto fun = …boost::bind(…)…;
   set<pair<int,long>,decltype(fun)> s (fun);
   main_main(boost::bind(…));
}

至于实际的绑定表达式,我认为它是这样的:

typedef std::pair<int,long> pil;
boost::bind(&pil::second,_1) < boost::bind(&pil::second,_2)

(未测试的)