В этом объявлении
priority_queue<int, vector<int>, greater<int>> minheap;
greater<int>
- это аргумент шаблона, который определяет тип и соответствует параметру шаблона типа class Compare
в priority_queue
template<class T, class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue;
В этомВ операторе
sort (numbers.begin(), numbers.end(), std::greater<int>());
используется конструктор по умолчанию для создания временного объекта типа greater<int>
.
std::greater
- это структура шаблона
template<class T = void> struct greater;
то есть его специализация предоставляет тип.
Вы можете использовать специализации шаблона в качестве спецификатора типа в объявлениях.Например,
std::greater<int> obj1;
std::greater<double> obj2;
std::greater<std::string> obj3;
В первом случае вы должны указать аргумент типа для соответствующего параметра шаблона типа.
Во втором случае вы должны указать объект типа greater<int>
.
Учтите, что если вы попытаетесь использовать запись std::greater<int>()
в качестве аргумента шаблона для priority_queue, то компилятор рассматривает ее как спецификатор типа функции, который имеет тип возвращаемого значения std::greater<int>
и не имеетпараметры.Потому что компилятор ожидает спецификатор типа в качестве аргумента шаблона, а не выражения.Но указание такого типа функции в качестве аргумента шаблона типа не имеет смысла для priority_queue.
Чтобы сделать его более понятным, переписать вызов std :: sort следующим образом
std::greater<int> obj;
sort (numbers.begin(), numbers.end(), obj );
Как вы видите, std::greater<int>
является спецификатором типа для переменной obj
, которая передается в качестве аргумента функции std::sort
.Разница между приведенным выше вызовом и этим вызовом
sort (numbers.begin(), numbers.end(), std::greater<int>());
заключается в том, что в последнем случае создается временный объект типа std::greater<int>
, подобный std::greater<int>()
.
.демонстрационная программа
#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
std::greater<int> comp;
// Here is used an already created object of the type std::greater<int>
std::sort( std::begin( a ), std::end( a ), comp );
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
// Here is used a remporary object of the type std::less<int>
std::sort( std::begin( a ), std::end( a ), std::less<int>() );
for ( const auto &item : a ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
Вывод программы
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9