Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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,我的优先级队列声明为: std::priority_queue<*MyClass> queue; class MyClass { bool operator<( const MyClass* m ) const; } std::优先级队列; 类MyClass{ bool操作符该操作符由于您的优先级队列仅包含指针值,因此它将使用指针的默认比较操作符-这将按地址对指针进行排序,这显然不是您想要的。如果您更改优先级队列以按值存储类实例,它将使用您定义的操作符很好。或者,您

我的优先级队列声明为:

std::priority_queue<*MyClass> queue;

class MyClass {
    bool operator<( const MyClass* m ) const;
}
std::优先级队列;
类MyClass{

bool操作符该操作符由于您的
优先级队列
仅包含指针值,因此它将使用指针的默认比较操作符-这将按地址对指针进行排序,这显然不是您想要的。如果您更改
优先级队列
以按值存储类实例,它将使用您定义的操作符很好。或者,您必须提供一个比较函数。

为que提供比较函子ptr\u less

如果希望ptr_less与std库的其余部分(活页夹、编写器等)兼容:

模板
无结构
:公共二进制函数{
布尔运算符()(常数T和左、常数T和右)常数{

return((*left)不确定优先级队列的内容,因为我从未使用过它,但要进行直接排序,可以执行以下操作:

class A
{
    friend struct ComparePtrToA;
public:
    A( int v=0 ):a(v){}
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return a1->a < a2->a;}
};

#include <vector>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
    vector<A*> someAs;
    someAs.push_back(new A(1));
    someAs.push_back(new A(3));
    someAs.push_back(new A(2));
    sort( someAs.begin(), someAs.end(), ComparePtrToA() );
}
A类
{
友元结构比较程序;
公众:
A(intv=0):A(v){
私人:
INTA;
};
结构比较程序
{
bool操作符()(A*a1,A*a2){return a1->AA;}
};
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
向量体;
例如,推回(新的A(1));
例如,推回(新的A(3));
有些人。推回(新的A(2));
排序(someAs.begin()、someAs.end()、ComparePtrToA());
}
请注意内存泄漏,这只是一个示例

进一步说明:这不是优先级队列的实现!向量只是使用我创建的函子通过指针比较两个对象的一个示例。尽管我知道优先级队列是什么,以及它的大致工作方式,但我从未使用过实现它们的STL功能

更新:我认为TimW提出了一些正确的观点。我不知道为什么他会被否决这么多。我认为我的答案可以改进如下:

class A
{
public:
    A( int v=0 ):a(v){}
    bool operator<( const A& rhs ) { return a < rhs.a; }
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return *a1 < *a2;}
};
A类
{
公众:
A(intv=0):A(v){

BoOL操作程序可以告诉我是什么错误,为什么1,这个代码是工作的,是有效的C++代码。它使模板操作符和东西变得困难。但是,对于特定的MyC类,两个指针之间的操作符必须在某个地方实现。所以我的解决方案是泛型的?当然,你需要一些方法来比较两个MyCL。ass对象。现在你需要一个特殊的操作符来比较两个MyClass指针,我需要比较两个MyClass对象更自然的东西。这当然比这一种情况需要更多的机制。但是在其他情况下,这个模板可能会有用,它可以与实现操作符*(而不仅仅是指针)的任何东西一起工作。为什么MyClass需要知道它是通过指针比较的吗?它必须是可比较的,如果需要的话,算法需要使用指针。我必须指出,这是一个非常糟糕的方法来实现优先级队列,内存泄漏等等。如果你只需要一个排序数组,那么很好,但是优先级队列有一个非常不同的实现方式我认为他只是以sort()为例,这样(a)他就可以在工作代码中而不是单独使用比较器,但是(b)他不必使用priority_队列本身,他说他不熟悉…这个答案为比较器类提供了正确的实现函数。它适用于我的priority队列。当然,我考虑了我的内存情况。我需要一个指针的priority_队列不是为了好玩。正如我所说的,但自从quest之后ion是关于优先级队列的,我们不希望一些年轻而敏感的人进来看到这一点,并认为使用排序数组真的是一种用于优先级队列的好方法,我真的无法遵循。我给你一个额外的关注分离的答案,我得到了两张反对票。为什么我的类需要知道它与h指针?关于开闭原理,当您决定还需要值类型的std::priority_que而不是指针时,您将怎么做。
struct ptr_less {
    template<class T>
    bool operator()(const T& left, const T& right) const {
        return ((*left) <( *right));
    }
};

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less > que; 
class A
{
    friend struct ComparePtrToA;
public:
    A( int v=0 ):a(v){}
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return a1->a < a2->a;}
};

#include <vector>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
    vector<A*> someAs;
    someAs.push_back(new A(1));
    someAs.push_back(new A(3));
    someAs.push_back(new A(2));
    sort( someAs.begin(), someAs.end(), ComparePtrToA() );
}
class A
{
public:
    A( int v=0 ):a(v){}
    bool operator<( const A& rhs ) { return a < rhs.a; }
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return *a1 < *a2;}
};