Сложные типы std::priority_queue?

Я хочу использовать std::priority_queue со сложными типами:

typedef struct
{
uint8_t data;
    uint64_t moredata;
}myData;

typedef struct
{
    boost::mutex someQueueLock;
    std::priority_queue<myData> myQueue; //does not work
}

Я не хочу использовать очередь, полную указателей (priority_queue), потому что указатели могут стать недействительными.

Это вообще возможно? Или я должен использовать другой стандартный контейнер?

2 ответа

Решение

std::priority_queue использует operator< для сортировки элементов по умолчанию требуется строгий порядок элементов

Вам нужно определить operator< функция для myData тип

bool operator<(const myData& lhs, const myData& rhs)
{
    return lhs.data < rhs.data;
}

§ 23.6.4.1 Шаблон класса priority_queue

Любой контейнер последовательности с итератором произвольного доступа и поддерживающими операциями front(), push_back() и pop_back() может использоваться для создания экземпляра priority_queue. В частности, можно использовать vector (23.3.6) и deque (23.3.3). Создание priority_queue также включает в себя предоставление функции или функционального объекта для выполнения сравнения приоритетов; библиотека предполагает, что функция или объект функции определяет строгий слабый порядок (25.4).

§ 25.4

Все операции в 25.4 имеют две версии: одна, которая принимает объект функции типа Compare, и другая, которая использует оператор<.

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

bool MyCompare(const myData& left, const myData& right)
{
    // todo: return true if left has higher priority than right
}

std::priority_queue<myData, std::vector<myData>, MyCompare> queue;
Другие вопросы по тегам