如何对同一个优先级队列使用不同的比较器?

How to use different comparators for the same priority queue?

根据条件,我需要在同一个vector<Objects>

上使用不同的比较器类
priority_queue<Object, vector<Object>> pq;

if (something...)
    priority_queue<Object, vector<Object>, Comp1> pq;
else if(...)
    priority_queue<Object, vector<Object>, Comp2> pq;
else
    priority_queue<Object, vector<Object>, Comp3> pq;

... All further code works on pq & does not change on the conditions.

我该如何实现?我发现不建议更改比较器,因为它会导致未定义的行为,但在这里我只需要根据特定条件初始化不同的比较器。

使用 std::function<bool(Object const&, Object const&)> 作为比较器,然后在构建过程中传入适当的仿函数。

//typedef just void repeating myself over and over
typedef priority_queue<Object, vector<Object>, std::function<bool(Object const&, Object const&)>> queue_type;
queue_type pq;
if (something...)
    pq = queue_type{std::less<Object>{}};
else if(...)
    pq = queue_type{std::greater<Object>{}};
else
    pq = queue_type{...};

注意,如果在构造队列时未能提供有效的比较函数,将导致在进行任何依赖于比较的操作时抛出异常。

作为替代方案,您可以将代码重写为:

template <typename Comp>
void foo()
{
    priority_queue<Object, vector<Object>, Comp> pq;
    // ... All further code works on pq & does not change on the conditions.
}

然后

if (something...) {
    foo<Comp1>>();
} else if(...) {
    foo<Comp2>>();
} else {
    foo<Comp3>>();
}