gpt4 book ai didi

c++ - 如何正确使用 std::functional 其他数据类型(在优先队列中)

转载 作者:行者123 更新时间:2023-11-30 04:16:47 24 4
gpt4 key购买 nike

我目前正在研究 std::functional 中的 std::greater、std::lesser 等类。

如您所见,这些类带有<>,因此它们可以用于任何数据类型。因此,我试图通过重载 bool 运算符让这些类“正确地”识别顺序。

但是,这是我尝试过的,但没有正常工作。

#include <iostream>
#include <queue>
#include <vector>
#include <functional>

class MyClass
{
public:
MyClass(int x, std::string str) {(*this).x = x; (*this).str = str;}
int getInt()const{return (*this).x;}
std::string getStr(){return this->str;}
bool operator <(const MyClass& ot)const{return (*this).getInt() < ot.getInt();}
bool operator >(const MyClass& ot)const{return (*this).getInt() > ot.getInt();}
private:
int x;
std::string str;
};
int main()
{
std::priority_queue<MyClass*,std::vector<MyClass*>,std::less<MyClass*> > MinQ;
std::priority_queue<MyClass*,std::vector<MyClass*>,std::greater<MyClass*> > MaxQ;
MyClass *m = new MyClass(1,"one");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(36,"thirty six");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(47,"forty six");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(1,"first");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(2,"second");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(2,"two");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(7,"seven");
MinQ.push(m); MaxQ.push (m);
m = new MyClass(28,"twenty eight");
MinQ.push(m); MaxQ.push (m);

while(!MinQ.empty())
{
std::cout<<MinQ.top()->getStr()<<std::endl; MinQ.pop();
}
std::cout<<"------------------------------------------------"<<std::endl;
while(!MaxQ.empty())
{
std::cout<<MaxQ.top()->getStr()<<std::endl; MaxQ.pop();
}

}

结果:

twenty eight
seven
two
second
thirty six
forty six
first
one
------------------------------------------------
one
first
forty six
thirty six
second
two
seven
twenty eight

有人可以给我解释一下和/或给我一些正确的建议吗?

最佳答案

问题是您在数据结构中使用指针而不是对象。

您有两个解决方案:要么编写一个作用于指针的仿函数:

struct Greater
{
bool operator()(MyClass *a, MyClass *b) const
{
return *a > *b;
}
};

std::priority_queue<MyClass*,std::vector<MyClass*>, Greater > MaxQ;

要么直接使用对象(我强烈推荐这种方法,但它并不总是适用)。

std::priority_queue<MyClass,std::vector<MyClass>, std::less<MyClass> > MinQ;

关于c++ - 如何正确使用 std::functional 其他数据类型(在优先队列中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17528224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com