我已经定义了一个类,它维护着一个到其他数据结构的双打映射的有序映射。根据用例,我希望其他用户按升序或降序排列。
struct Book {
std::map<double, Level> levels;
// More complexity ...
void process(Tick &t);
const unsigned amount;
// More stuf ...
Book(const unsigned amount) : levels(), id_price() {}
};
理想情况下,这应该在Book的构造函数中指定。我可以传递std::less<double>()
,但这不起作用,因为我不能使用变量来声明地图levels
,对吧?它适用于模板吗?我不想让它成为通用类型。不应该增加不必要的复杂性应该是双倍的。想法?
答案 0 :(得分:3)
您可以按以下方式定义自定义比较器:
class comparator {
public:
bool descending;
comparator(bool descending) : descending(descending) {}
bool operator()(double a, double b) const
{
return descending ? b < a:a < b;
}
};
然后,在您的班级中,定义指定此比较器类的地图:
std::map<double, Level, comparator> levels;
然后,您的构造函数需要显式初始化此比较器,并使用它来初始化您的类的映射。 std::map
的构造函数接受一个可选参数,该参数传递地图将使用的比较器类的实例。然后,对于Book
的每个实例,其构造函数可以指定对levels
进行排序的方式。
P.S。 double
是poor choice for a map key,但这是一个不同的问题。
答案 1 :(得分:2)
您可以定义地图以使用自定义比较器
struct Compare
{
bool operator()(double l, double r) const {
return cmp(l, r);
}
std::function<bool(double, double)> cmp;
};
然后您将地图定义如下:
std::map<double, Level, Compare> levels;
和构造函数
template<typename T>
Book(T comparator) : levels(Compare{comparator}) {}
然后你可以用你想要的任何比较器初始化地图
Book a(std::less<>{});
如果你不想要std::function
的开销,你可以在比较器中实现更严格的逻辑。