如何在C++中创建一个有序的分数集合?
我想知道在处理其他分数输入时,如何在保持其 order_of_key 和 find_by_order 操作可用的前提下,维护一个有序的分数集合(形式为p/q)。
(所谓的有序集合,是指g++的 Policy-Based Data Structure,它保持元素的唯一性并按排序顺序排列:https://www.geeksforgeeks.org/cpp/ordered-set-gnu-c-pbds/。)
示例:
ordered_set = {2/5, 2/3, 3/4, 3/2, 5/3, 2/1}
执行这些操作后,你将得到:
ordered_set.order_of_key(2/3) = 2
ordered_set.order_of_key(1/2) = 1
ordered_set.find_by_order(1) = 3/4
ordered_set.find_by_order(0) = 2/5
我尝试像对普通集合那样,创建一个“Fraction”类,以及一个自定义比较器。然而,编译时出现错误,提示有序集合只接受一个参数,而我却要给它两个参数。
我的有序集合实现:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
我的Fraction类与自定义比较器:
struct Fraction {
int n;
int d;
};
struct cmp{
bool operator()(const Fraction &x, const Fraction &y) const {
return (x.n * y.d) < (x.d * y.n);
}
};
我尝试让有序集合按自定义比较器排序:
ordered_set<Fraction, cmp> os;
显示的错误:
error: wrong number of template arguments (2, should be 1)
还有其他方法可以让有序集合按分数排序吗?
解决方案
如果你想单独指定比较器,请把你的有序集合更新为如下所示:
template<class T, class C> using ordered_set = tree<T, null_type, C, rb_tree_tag, tree_order_statistics_node_update>;
现在你可以指定两个模板参数。
或者你也可以为你的 Fraction 类实现一个 operator <,那么 less<T> 就能得到正确的效果,你就不需要两个参数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。