自定义比较器(排序)作为(多)映射排序参数?
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】:
以这种形式使用Comparator
和order
:
std::multimap <int, int, Comparator> boundary (order);
先在<>
里面传递比较类型,然后在构造函数中传递比较对象。
【讨论】:
以上是关于自定义比较器(排序)作为(多)映射排序参数?的主要内容,如果未能解决你的问题,请参考以下文章