Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;什么';实现具有不同优先级函数的优先级队列的最佳方法是什么?_C++_Priority Queue - Fatal编程技术网

C++ C++;什么';实现具有不同优先级函数的优先级队列的最佳方法是什么?

C++ C++;什么';实现具有不同优先级函数的优先级队列的最佳方法是什么?,c++,priority-queue,C++,Priority Queue,我看到的替换优先级队列比较器的公认答案是在新的比较类中重载操作符 class Foo { }; class Compare { public: bool operator() (Foo, Foo) { return true; } }; int main() { std::priority_queue<Foo, std::vector<Foo>, Compare> pq; return 0; } class-

我看到的替换优先级队列比较器的公认答案是在新的比较类中重载操作符

class Foo
{

};

class Compare
{
public:
    bool operator() (Foo, Foo)
    {
        return true;
    }
};

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
    return 0;
}
class-Foo
{
};
班级比较
{
公众:
bool运算符()(Foo,Foo)
{
返回true;
}
};
int main()
{
std::优先级队列pq;
返回0;
}

但是,我想为队列实现几个(10+)不同的比较函数,并在运行时在main()中创建pq时选择一个。是否必须创建10个不同的比较类,或者是否有更简单的方法来执行此操作?

使用函数作为比较器模板参数,将函数实例传递给队列的构造函数,请参阅

对于类型,可以使用C++函数对象<代码> STD::Fuff< /Cuff>或C函数指针,即<代码>布尔(*)(confo&a,confoo&b)< /c> > /p> 我必须做10个不同的比较类,还是有更简单的方法

你不必这么做。优先级队列要求比较器采用
Foo
并返回
bool
——默认值为
std::less

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;
模板<
T类,
类容器=std::vector,
类比较=std::less
>类优先级队列;
在您的情况下,可以使用lambda或函数指针来实现此目的。比如说,

using cmp1 = bool(*)(const Foo&, const Foo&);
bool FooCmp1(const Foo& f1, const Foo& f2)
{
     // do real comparison..
     return true;
}

priority_queue<Foo, std::vector<Foo>, cmp1> pq(FooCmp1);
使用cmp1=bool(*)(常量Foo&,常量Foo&);
bool FooCmp1(恒富和f1、恒富和f2)
{
//做真实的比较。。
返回true;
}
优先级队列pq(FooCmp1);

根本不需要上课。您可以定义比较函数(
boolcomparen(const&Foo,const&Foo){…}
)或使用。这些比较函数的范围是什么?我可以把它们放在Foo本身吗?@knowads如果在构造队列时传递它,队列将复制比较器,并且从不更改它。无法存储在项中。您可以将函数放在
Foo
中,但建议您不要这样做。如果一个函数可以是一个,就让它自由。这通常会提高重用性。您需要实现一个容器适配器,就像
std::priority\u queue
一样,但是如果排序函数发生变化,它会重新排序包装好的容器。