priority_queue <> сравнение для указателей? - PullRequest
4 голосов
/ 05 октября 2009

Так что я использую STL priority_queue <> с указателями ... Я не хочу использовать типы значений, потому что будет невероятно расточительно создавать кучу новых объектов только для использования в очереди приоритетов. Итак ... я пытаюсь сделать это:

class Int {
public:
    Int(int val) : m_val(val) {}
    int getVal() { return m_val; }
private:
    int m_val;
}


priority_queue<Int*> myQ;

myQ.push(new Int(5));
myQ.push(new Int(6));
myQ.push(new Int(3));

Теперь, как я могу написать функцию сравнения, чтобы правильно расположить их в Q? Или кто-то может предложить альтернативную стратегию? Мне действительно нужен интерфейс priority_queue и я хотел бы не использовать конструкторы копирования (из-за огромных объемов данных). Спасибо

РЕДАКТИРОВАТЬ: Int это просто заполнитель / пример ... Я знаю, я могу просто использовать int в C / C ++ LOL ...

Ответы [ 3 ]

10 голосов
/ 05 октября 2009

Вы можете явно указать, какой компаратор должен использовать ваша очередь.

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

class Int {
public:
    Int(int val) : m_val(val) {}
    int getVal() { return m_val; }
    bool operator<(const Int &other) const { return m_val < other.m_val; }
private:
    int m_val;
};

template<typename Type, typename Compare = std::less<Type> >
struct pless : public std::binary_function<Type *, Type *, bool> {
    bool operator()(const Type *x, const Type *y) const
        { return Compare()(*x, *y); }
};

int main(int argc, char *argv[]) {
    std::priority_queue<Int*, std::vector<Int*>, pless<Int> > myQ;

    for (int i = 1; i < argc; i++) {
        std::stringstream ss(argv[i]);
        int x;
        ss >> x;
        myQ.push(new Int(x));
    }

    for (; !myQ.empty(); delete myQ.top(), myQ.pop())
        std::cout << myQ.top()->getVal() << std::endl;

    return 0;
}
3 голосов
/ 05 октября 2009

Один вариант, который наверняка сработает, - это заменить Int* на shared_ptr<Int>, а затем внедрить operator< для shared_ptr<Int>

bool operator<(const shared_ptr<Int> a, const shared_ptr<Int> b)
{
    return a->getVal() < b->getVal();
}
0 голосов
/ 05 октября 2009

Целое число того же размера, что и указатель в 32-разрядных системах. В 64-битных системах указатель будет в два раза больше. Поэтому проще / быстрее / лучше использовать обычные целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...