Моя приоритетная очередь объявлена как:
std::priority_queue<*MyClass> queue;
class MyClass {
bool operator<( const MyClass* m ) const;
}
Не сортирует элементы в очереди.
Что случилось? Я не хотел бы реализовывать другой класс (Сравнить).
Резюме ответа:
Проблема в том, что адреса указателей отсортированы. Единственный способ избежать этого - класс, который «сравнивает указатели».
Теперь реализовано как:
std::priority_queue<*MyClass, vector<*MyClass>, MyClass::CompStr > queue;
class MyClass {
struct CompStr {
bool operator()(MyClass* m1, MyClass* m2);
}
}
4 ответа
Дайте очереди функтор сравнения ptr_less.
Если вы хотите, чтобы ptr_less был совместим с остальной частью библиотеки std (биндеры, композиторы, ...):
template<class T>
struct ptr_less
: public binary_function<T, T, bool> {
bool operator()(const T& left, const T& right) const{
return ((*left) <( *right));
}
};
std::priority_queue<MyClass*, vector<MyClass*>, ptr_less<MyClass*> > 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() );
}
Обратите внимание на утечки памяти, это только пример ...
Дополнительное примечание: это не предназначено для реализации очереди с приоритетами! Вектор - это просто пример использования созданного мною функтора для сравнения двух объектов с помощью их указателей. Хотя я знаю, что такое приоритетная очередь и примерно как она работает, я никогда не использовал функции 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;}
};
Который чище (особенно если вы рассматриваете контейнер значений, а не указатели - дальнейшая работа не требуется).
Поскольку ваш priority_queue
содержит только значения указателей, он будет использовать оператор сравнения по умолчанию для указателей - это будет отсортировать их по адресу, который, очевидно, не тот, который вам нужен. Если вы измените priority_queue
для хранения экземпляров класса по значению, он будет использовать оператор, который вы определили. Или вам нужно будет предоставить функцию сравнения.
Предоставленный вами operator <() будет сравнивать объект MyClass с указателем на объект MyClass. Но ваша очередь содержит только указатели (я думаю). Вам нужна функция сравнения, которая принимает в качестве параметров два указателя.
Все это основано на некоторых предположениях - пожалуйста, опубликуйте свой фактический код, используя копирование и вставку.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .