Я пытаюсь понять, как работает компаратор для приоритетной очереди, я сделал несколько тестов:
Тест 1: создайте класс компаратора и используйте priority_queue<T, vector<T>, cmp>
Всегда отлично работает
Тест 2:
struct test {
int a = 0;
};
bool operator<(const test& lhs, const test& rhs) {
return lhs.a < rhs.a;
}
int main()
{
priority_queue<test> pq;
}
Это работает как ожидалось.
Тест 3: Поместите тест 2 в класс
class T{
struct test {
int a = 0;
};
bool operator<(const test& lhs, const test& rhs) {
return lhs.a < rhs.a;
}
};
Ошибка компиляции:
'bool T::operator<(const T::test&, const T::test&)' must take exactly one argument
Похоже, что компилятор подумал, что я перегружал оператор <для класса T. Есть ли другие способы сделать это, если мне действительно нужно, чтобы классы были вложенными? </p>
Тест 4: оператор перегрузки <</p>
struct test {
int a = 0;
bool operator<(const test& rhs) {
return a < rhs.a;
}
};
int main()
{
vector<test> v;
sort(v.begin(), v.end()); // No error
set<test> s; // No error
priority_queue<test> pq; // Compiling error
}
Только priority_queue выдает ошибку:
'passing 'const test*' as 'this' argument discards qualifiers'
Я не знаю, почему это работает для сортировки и установки, но не для приоритетной очереди.