Каково поведение std :: better в std :: priority_queue?

Когда я использовал std::greater<int> в качестве объекта функции сравнения в std::sort следующим образом:

std::sort(array_name, array_name + length, std::greater<int>());

Массив, отсортированный в порядке невозрастания (т.е. сначала наибольшее число)

Но когда я использовал ту же функцию сравнения в std::priority_queue, как показано ниже:

std::priority_queue <int, std::vector<int>, std::greater<int> > pq_name;

Почему функция-член std::priority_queue::top сначала возвращает наименьшее число?

(Мне нужно четкое сравнение двух случаев).

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

Joseph D. 09.04.2018 02:17

@codekaizer Хорошо, я сейчас читаю об этом, и мне кажется, что это полезный совет от вас, спасибо.

Abdulkader 09.04.2018 02:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 149
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

CPPRef говорит об этом:

A user-provided Compare can be supplied to change the ordering, e.g. using std::greater would cause the smallest element to appear as the top().

Note that the Compare parameter is defined such that it returns true if its first argument comes before its second argument in a weak ordering. But because the priority queue outputs largest elements first, the elements that "come before" are actually output last. That is, the front of the queue contains the "last" element according to the weak ordering imposed by Compare.

Итак, для упорядочивания на основе std::less по умолчанию верхняя часть очереди - это самый большой элемент, который при сортировке идет последним. OTOH с std::greater последний элемент самый маленький.

На самом деле я прочитал это в той же ссылке перед тем, как спросить, но у меня до сих пор нет четкого сравнения между этими двумя случаями и почему std :: priority_queue ведет себя так? !!. Спасибо.

Abdulkader 09.04.2018 01:54

Хотя std :: priority_queue выводит сначала самые большие элементы, почему по умолчанию используется std :: less вместо std :: large (в отличие от первого случая в вопросе)?!

Abdulkader 09.04.2018 02:02
Ответ принят как подходящий

Чтобы понять, почему это происходит, вы должны понимать структуры данных, с которыми вы работаете.

Вопрос: Что такое массив? А: Массив - это непрерывная область памяти, содержащая тип. Насколько нам известно, он может содержать любой тип объекта. Но поскольку вы работаете с int, в C++ целое число обычно состоит из 32 бит, но это зависит от обстоятельств. Следовательно, ваше представление в памяти будет примерно таким:

| 4 bytes | 4 bytes | 4 bytes | (...)

Когда вы сортируете массив, оператор std::greater<int> будет «сортировать» ваш массив, сохраняя большее целое число в первой позиции, второе по величине значение во второй позиции и так далее.

Вопрос: Что такое std::priority_queue? А: Очередь с приоритетом - это куча, точнее, двоичное дерево. Куча - это структура данных, оптимизированная для возврата наибольшего значения по умолчанию. Этот тип кучи называется макс кучи. Но когда вы перегружаете сравнение в priority_queue с помощью оператора std::greater, вы преобразуете кучу в мин куча. Этот вид куч, аналогично тому, что происходит при перегрузке оператора метода std::sort, реализован для получения сначала минимального значения.

Имейте в виду, что представление кучи в памяти полностью отличается от представления в массиве.

Ваш способ объяснения очень прост и удивителен, спасибо.

Abdulkader 09.04.2018 04:58

Другие вопросы по теме