map
您可以在定义它时将“静态”比较函子传递给。默认排序tuple<...>
是对类型的字典排序。
将键类型扩展到允许将字段标记为max
或min
值的类型,并提供接受它们的排序算法。
即,像这样:
template<typename T>
struct InfiniteExtensionOf
{
enum ExtendedOrder {NegInfinity=-1, Normal=0, PosInfinity=1};
ExtendedOrder order;
T value;
bool operator<(InfiniteExtensionOf const& other) const
{
if (order != other.order)
return order<other.order;
return value < other.value;
}
template<typename U>
InfiniteExtensionOf( U&& u ):order(Normal),value(std::forward(u)) {}
InfiniteExtensionOf( InfiniteExtensionOf&& other ):order(other.order),value(std::move(other.value)) {}
InfiniteExtensionOf( InfiniteExtensionOf& other ):order(other.order),value(other.value) {}
InfiniteExtensionOf( InfiniteExtensionOf const& other ):order(other.order),value(other.value) {}
InfiniteExtensionOf( ExtendedOrder& eo ):order(eo), value() {}
InfiniteExtensionOf( ExtendedOrder&& eo ):order(eo), value() {}
InfiniteExtensionOf( ExtendedOrder const& eo ):order(eo), value() {}
};
然后像这样键:
map<tuple<InfiniteExtensionOf<int>, InfiniteExtensionOf<int>, InfiniteExtensionOf<int>, InfiniteExtensionOf<string>>, Value> myMap;
它应该接受tuple
不带InfiniteExtensionOf
参数的 s (我希望这样的元组隐式转换),并且您可以在调用时轻松地将 +inf 或 -inf 指定为特定字段的值lower_bound
or upper_bound
。
...
请注意,如果lower_bound
采用模板参数并且只要求它以与现有排序一致的方式与地图中的元素兼容,那么麻烦会更少。:) 但遗憾的是,这不是真的。