Сложные типы 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;