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

Posted

技术标签:

【中文标题】自定义比较器(排序)作为(多)映射排序参数?【英文标题】:Custom comparator (ordering) as a (multi)map ordering parameter? 【发布时间】:2013-05-02 16:15:09 【问题描述】:

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

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

预期调用类似于:myFunction(std::greater<int>());

首先,我尝试将函数声明为:void myFunction(binary_operator<int, int, bool> order);,但根据this explanation,binary_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

我得到的编译错误:

错误:“模板类 std::multimap”的模板参数列表中参数 3 的类型/值不匹配 错误:需要一个类型,得到“订单”

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

谁能解释一下这里发生了什么以及如何获得 multimap 使用排序作为函数参数传递?

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

【问题讨论】:

错误很明显,order是对象不是类型,所以不能传入模板参数。 std::multimap 需要一个 type 作为模板参数,并且您正在使用一个对象。 好的,我看到了类型/对象问题。但是,这只是回答为什么我收到错误,而不是如何使用我想要的排序(作为函数参数传递)来排序我的结构,包括multimap 【参考方案1】:

应该声明如下:

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

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

【讨论】:

好的,我看到了类型/对象的问题。但是,像这样,multimap 中的元素有哪些确切的顺序?如何实现在函数调用中作为函数参数传递的任何内容对它们进行排序? @penelope 为错字道歉,我刚刚修正了它。 @penelope 只需如上所示实例化,将order 作为构造函数参数传递。见here。【参考方案2】:

以这种形式使用Comparatororder

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

先在&lt;&gt;里面传递比较类型,然后在构造函数中传递比较对象。

【讨论】:

以上是关于自定义比较器(排序)作为(多)映射排序参数?的主要内容,如果未能解决你的问题,请参考以下文章

Java 为排序构建一个特定的自定义比较器

自定义排序及Hadoop序列化

【JS】数组对象自定义排序

如何将附加参数传递给自定义 python 排序函数

Excel多条件自定义排序

以模板为函数参数的 C++ 自定义比较函数