2015-11-25 2 views
1

Каждый раз, когда вы хотите использовать пользовательскую функцию сравнения для priority_queue, вы также должны передать ей контейнер. Мне кажется, вы всегда должны передать vector<T>. Теперь сначала я подумал, что это какая-то избыточность, но это не должно быть так. Какая польза от передачи контейнера priority_queue и как я могу его использовать?Что нужно для передачи контейнера в priority_queue

+0

Мне не нравится ваш 'vector '. Я хочу использовать свой собственный вектор >. Почему вы хотите запретить это? –

ответ

1

Вы просто передаете ему базовый тип контейнера, который по умолчанию равен std::vector<T>. Если вы хотите сохранить поведение по умолчанию, то вы правы, говоря, что всегда можете пройти std::vector<T>. Вы можете также использовать std::deque<T> или любой пользовательский контейнер, который предоставляет следующие функции:

  • пустого()
  • размера()
  • фронта()
  • push_back()
  • pop_back()

Но почему вы должны указать контейнер, прежде чем указывать компаратор? Ну, это просто связано с тем, как определяются параметры. container и compare оба являются параметрами по умолчанию, а container просто на первом месте. Из-за того, как работает C++, вам просто нужно передать все параметры, ведущие до compare, прежде чем вы сможете передать его, а это значит, что вы также должны пройти container. AFAIK это не имеет никакого отношения к compare что-то нужно знать о container.

+0

Причина в том, что используемый компаратор - это тот, который поставляется с контейнером - нет смысла держать два компаратора вокруг и игнорировать один из них. –

6

std::priority_queue - контейнерный адаптер. На самом деле он не знает, как хранить элементы, которые вы вставляете в него; он делегирует это реальному контейнеру, например std::vector. Редко, что вы хотите использовать что-то отличное от std::vector в качестве основного контейнера, но вы можете использовать std::deque, если хотите.

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

+0

Также стоит упомянуть, что очереди приоритетов на самом деле являются двоичными кучами, а последние обычно реализуются в непрерывном хранилище, таком как массив или 'std :: vector'. – vsoftco