自定义比较器(排序)作为(多)映射排序参数?

时间:2013-05-02 16:15:10

标签: c++ comparator

我的问题在很多方面类似于这个问题:Pass a custom comparator through a function,但我尝试了那里提出的解决方案,并且无法让它发挥作用。

简而言之,我有一个方法可以保留多个排序结构并执行多次比较,始终使用int类型的元素,使用相同的排序。调用方法时确定

预期电话类似于:myFunction(std::greater<int>());

首先,我尝试将函数声明为:void myFunction(binary_operator<int, int, bool> order);但是,根据this explanationbinary_function不适合在函数调用中充当基类。

最后,我尝试了来自this answer(和许多其他网站)的建议,建议使用模板。但是,我仍然无法编译我的代码。

最小的非工作示例:

template <typename Comparator> 
void myFunction(Comparator order){

  if (order(1,2)){
      // some stuff
      // COMPILES OK
  }

  std::vector <int> vecToSort;
  // ... initialize
  std::sort(vecToSort.begin(), vecToSort.end(), order); // works
  // COMPILES OK

  std::multimap <int, int, order > boundary;
  // STARTS KICKING, SCREAMING AND SHOUTHING
}

我得到的编译错误:

  

错误:模板参数列表中参数3的类型/值不匹配'template class std :: multimap'   错误:期望一个类型,得到'订单'

我认为同样的技巧应该适用于两者。它不是。 (编辑:我现在可以看到type / object问题)

有人可以解释一下这里发生了什么,如何 multimap 使用订单作为函数参数传递?

PS:我没有在这个项目中使用boost。

2 个答案:

答案 0 :(得分:2)

应声明如下:

std::multimap <int, int, Comparator> boundary(order);
                         ^^^^^^^^^^

正如评论所说,您需要提供type而不是objectConstruct multimap的这些文档提供了一些示例。

答案 1 :(得分:2)

以这种形式使用Comparatororder

std::multimap <int, int, Comparator> boundary (order);

首先传递<>内的比较类型,然后在构造函数中传递compare对象。