stl priority_queue C ++ со структурой

Как мы можем использовать STL priority_queue для структуры? Любая иллюстрация нажатия и извлечения, когда структура имеет несколько типов данных?
Скажите: struct thing { int a; char b;} glass[10];.
Теперь, как я могу поместить эту структуру в priority_queue, используя 'int a' для упорядочивания?


person Manas Verma    schedule 24.03.2013    source источник


Ответы (3)


Вот слегка измененный ответ на ваш исходный вопрос, который вы удалили без видимой причины. Оригинал содержал достаточно информации, чтобы вы могли это понять, но вот оно: предоставьте меньшее, чем сравнение, в котором для сравнения используется int.

Все, что вам нужно сделать, это предоставить функтор, который реализует сравнение «меньше чем» со строгим слабым порядком, или оператор «меньше чем» для вашего класса, реализующий то же самое. Эта структура удовлетворяет требованиям:

struct thing
{
    int a;
    char b;
    bool operator<(const thing& rhs) const
    {
        return a < rhs.a;
    }
};

тогда

std::priority_queue<thing> q;
thing stuff = {42, 'x'};
q.push(stuff);
q.push(thing{4242, 'y'}); // C++11 only
q.emplace(424242, 'z'); // C++11 only    
thing otherStuff = q.top();
q.pop();
person juanchopanza    schedule 24.03.2013
comment
Спасибо ^ _ ^ и последнее: как я могу напрямую отправить say (3, a) в очередь? Я не знаю, как поместить (3, a) в 'thing stuff = ...'. - person Manas Verma; 24.03.2013
comment
В C ++ 11 вы можете сказать q.push(thing{42, 'x'}) или q.emplace(42, 'x'). Если у вас нет поддержки C ++ 11, вам нужно предоставить thing конструктор. - person juanchopanza; 24.03.2013
comment
Обязательно ли, чтобы аргумент был константной ссылкой? Почему мы не можем просто использовать оператор bool ‹(thing rhs)? - person Primalr3d; 14.10.2020

Оператор перегрузки < для thing:

struct thing
{
    int a;
    char b;

    bool operator<(const thing &o) const
    {
        return a < o.a;
    }
};

priority_queue<thing> pq;

thing t1, t2, t3;

// ...

pq.push(t1);
pq.push(t2);

// ...

t3 = pq.top();
pq.pop();
person masoud    schedule 24.03.2013

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

Вы можете проверить этот ответ. Это может вам помочь. Я попытался объяснить несколько способов использования очереди приоритетов для пользовательских типов данных.

person Taohidul Islam    schedule 10.07.2017