В настоящее время я натыкаюсь на такие классы, как std :: больше, std :: lesser и т. Д. Из std :: function.
Как видите, эти классы имеют <>, поэтому их можно использовать с любым типом данных. Итак, я попытался заставить этот класс «правильно» распознавать порядок, перегрузив оператор 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
Может ли кто-нибудь дать мне объяснение по этому поводу и / или дать мне совет, как это сделать?
1 ответ
Проблема в том, что вы используете указатели в своих структурах данных, а не объекты.
У вас есть два решения: либо вы пишете функтор, работающий с указателями:
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++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .