Почему, когда priority_queue
используется с одним типом данных, таким как 'int', мы инициализируем его следующим образом: priority_queue<int>
[...]?
Поскольку std::priority_queue
является шаблоном класса, определенным следующим образом:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
Как видите, вы можете создать экземпляр этого класса, предоставив только T
, потому что остальные типы будут по умолчанию. Подробнее о шаблонных аргументах по умолчанию вы можете прочитать здесь .
, но когда он инициализируется парой, мы добавляем второй параметр типа vector priority_queue<pair<int,int>, vector<pair<int,int>>>
?
Потому что кто-то хотел быть явным. priority_queue<pair<int, int>>
эквивалентно priority_queue<pair<int,int>, vector<pair<int,int>>>
, потому что второй тип шаблона (vector<pair<int, int>>
) будет присутствовать по умолчанию.
- Почему второй параметр priority_queue является вектором? Что это значит и когда нужно указывать этот второй параметр?
Нам не нужно указывать его явно . Второй параметр шаблона - это тип, используемый для внутреннего представления данных. std::priority_queue
- это контейнерный адаптер , что означает, что он сам по себе не является контейнером - он использует какой-то другой контейнер и оборачивает его определенными утилитами.
В методе 2, зачем нужен decltype с этой лямбдой?
Поскольку вам нужно предоставить type . myCompare
- это struct
, поэтому это имя типа. myComp
это не тип, это переменная. Вы хотите получить объявленный тип ? Используйте decltype
.
В методе 2, почему объект leaderBoard нужно инициализировать с помощью (myComp)
?
Поскольку вы не можете создать объект по умолчанию с учетом decltype
лямбды. Вам необходимо использовать следующий конструктор:
explicit priority_queue(const Compare& compare)
: priority_queue(compare, Container()) { }
, который ожидает вызываемый объект (в данном случае - лямбду), который будет использоваться в качестве компаратора.
В методе 2, почему я не могу указать свою лямбду в качестве третьего аргумента напрямую?
Вы имеете в виду в качестве аргумента thirs template
? Потому что на данный момент лямбды нельзя использовать в неоцененных контекстах, и одним из них является предоставление типа для шаблона.
5.1. В чем разница между A.second > B.second
и A.second < B.second
?
Разница очевидна. Один проверяет, является ли A.second
большим, чем второй аргумент, а другой - обратным.
5.2 Как вы помните, какой из них означает восходящий, а какой - нисходящий?
Это довольно просто - концепция C++
заключается в использовании <
между левой стороны стороны аргументом и справа сторона стороны аргумент, вот так: left_hand_side < right_hand_side
.