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;}
};