Как реализовать метод сортировки для C++ priority_queue с указателями

У меня была та же проблема, и вот как я предлагаю вам ее исправить:

Выполните:

mvn dependency:list

и внимательно прочитайте, если есть какие-либо предупреждающие сообщения, указывающие на наличие некоторых зависимостей не будет доступных транзитивных зависимостей.

Если да, перезапустите его с флагом -X:

mvn dependency:list -X

, чтобы увидеть подробную информацию о том, на что жалуется maven (может быть много выходных данных для флага -X)

В моем случае была проблема в зависимом модуле maven pom.xml - с управляемой зависимостью. Хотя была версия для управляемой зависимости, определенной в родительском pom, Maven не смог ее разрешить и жаловался на отсутствующую версию в зависимом pom.xml

, поэтому я просто настроил отсутствующую версию, и проблема исчезла.

9
задан Peter Smit 25 October 2012 в 13:44
поделиться

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; 
11
ответ дан 4 December 2019 в 09:38
поделиться

Предоставленный вами оператор <() будет сравнивать объект MyClass с указателем на объект MyClass. Но ваша очередь содержит только указатели (я думаю). Вам нужна функция сравнения, которая принимает в качестве параметров два указателя.

Все это основано на некоторых предположениях - пожалуйста, опубликуйте свой фактический код, используя копирование и вставку.

4
ответ дан 4 December 2019 в 09:38
поделиться

Поскольку ваша priority_queue содержит только значения указателей, он будет использовать оператор сравнения по умолчанию для указателей - это будет отсортировать их по адресу, который явно не тот, который вам нужен. Если вы измените priority_queue для хранения экземпляров класса по значению, он будет использовать определенный вами оператор. Или вам нужно будет предоставить функцию сравнения.

4
ответ дан 4 December 2019 в 09:38
поделиться

Не уверен насчет приоритетов очереди, потому что я никогда не использовал но чтобы выполнить прямую сортировку, вы можете сделать это:

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 делает некоторые обоснованные выводы. Я не знаю, почему его так сильно отвергли. Думаю, мой ответ можно улучшить следующим образом:

3
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: