c++ - 如何在运行时指定 priority_queue 的比较器类

标签 c++ priority-queue comparator

我想创建一个“通用”priority_queue,它是 A 类的成员,这样我就不需要在编译时指定比较仿函数类。我将在运行时选择比较仿函数。我怎样才能实现这个目标?下面是我的用例的一个简化示例。

我不能使用任何 C++11 功能。

class A{
    private:
        priority_queue<T, vector<T>, ?> *pq;

    public: 
        A(string );
        ~A();
};

A::A(string s) {
    if(s == "1") 
        pq = new priority_queue<T, vector<T>, Mycomparator1>;
    else (s == "2") 
        pq = new priority_queue<T, vector<T>, Mycomparator2>;
}

A::~A(){
    delete pq;
}

struct Mycomparator1 {
    bool operator()(const T&a, const T&b){
        return a.x > b.x;
    } 
};

struct Mycomparator2 {
    bool operator()(const T&a, const T&b){
        return a.y > b.y
    } 
};

int main(){
    string s(argv[1]);
    A(s);
}

最佳答案

您无法在运行时决定比较器的类型。但是您可以做的是制作一个行为取决于运行时值的比较器。以下是一个适用于您的案例的简单示例:

struct MyComparator3 {
    bool compare_x;
    bool operator()(const T& a, const T& b) const {
        if (compare_x)
            return a.x > b.x;
        else
            return a.y > b.y;
    }
};

另一种更通用的可能性是使用类似 std::function<bool(T,T)> 的东西,或者(因为你说你不能使用 C++11)boost::function .

关于c++ - 如何在运行时指定 priority_queue 的比较器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519019/

相关文章:

c++ - 使用 Boost Program 选项读取相对文件路径

c++ - 如何在 C++ 中定义具有四个值的优先级队列?

具有自定义对象的 C++ 优先级队列

java - PriorityQueue 是 Java 不按自定义比较器降序排列

java - 在比较器中使用字符串时出现错误

c++ - 为什么缓存读取未命中比写入未命中快?

c++ - 从二进制数据中读取对象

java - 根据字数分析文本文件

c++ - 如何验证返回的 `auto` 变量是否为引用

c++ - 维护堆属性