Nano Hash - криптовалюты, майнинг, программирование

Почему параметр шаблона для компаратора в создании экземпляра Priorty_queue не запрашивается?

У меня есть следующий код, чтобы понять создание экземпляра объекта очереди с приоритетом.

#include <queue>
#include <functional>

int main(int argc, char *argv[])
{
    std::priority_queue<int, std::vector<int>, std::greater<>> int_min_heap;
    return 0;
}

Третий параметр шаблона priority_queue — функция сравнения. Как видно, я использовал 'std::greater'.

Это успешно компилируется, хотя я ожидал, что компиляция не удастся, поскольку я не указал параметр для std::greater, т.е. правильный способ (как мне кажется) создания экземпляра шаблона

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

Я мог бы найти любое определение std::greater без входного параметра.

Может ли кто-нибудь указать, что мне не хватает в понимании?

07.04.2016

  • Параметр шаблона std::greater имеет аргумент по умолчанию, который равен void. 07.04.2016
  • Я не смог [не] найти никакого определения std::greater без входного параметра. Вы искать? 07.04.2016
  • @NicolBolas Я проверил на www.cplusplus.com/, и это был источник путаница. Я почти всегда захожу на cplusplus.com для справки. Теперь у меня есть повод проверить и cppreference.com. Спасибо. 07.04.2016
  • @ user114754: Много лет назад cplusplus.com считался источником информации о C++. Его информация обычно считалась либо неполной, либо неточной, либо плохо изложенной. Лучше вообще избегать этого сайта. 07.04.2016

Ответы:


1

std::greater имеет параметр шаблона по умолчанию, поскольку c++14 равен void:

template< class T = void >
struct greater;

Но если бы это был только параметр шаблона по умолчанию, он потерпел бы неудачу, потому что вы не могли бы вызвать его с двумя int. Случилось так, что появилась специализация std::greater для пустоты, которая "оставляет типы параметров и тип возвращаемого значения для вывода" (из encppreference.com):

Стандартная библиотека предоставляет специализацию std::greater, когда T не указано, что оставляет типы параметров и тип возвращаемого значения для вывода.

greater<void> функциональный объект, реализующий x > y, выводящий аргументы и возвращаемые типы (шаблон класса специализация)


Обратите внимание, что без c++14 оба они не скомпилируются:

// error: wrong number of template arguments (0, should be 1)
std::priority_queue<int, std::vector<int> std::greater<>>

// error: forming reference to void
std::priority_queue<int, std::vector<int>, std::greater<void>>
07.04.2016
  • Кстати, это надо было сделать еще в 1998 году. 07.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..