Я объявил priority_queue
с пользовательским компаратором, имеющим векторное свойство. Ниже приведен полный код для него:
КОД
#include <bits/stdc++.h>
using namespace std;
class Compare
{
private:
vector<int> vec;
public:
Compare(const vector<int> &vec) { this->vec = vec; }
Compare(const Compare &obj)
{
this->vec = obj.vec;
cout << "Copy Constructor Called!\n";
}
bool operator()(const int &left, const int &right)
{
return vec[left] > vec[right];
}
};
int main(void)
{
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
priority_queue<int, vector<int>, Compare> pq{Compare(vec)};
cout << "Pushing 1\n";
pq.push(1);
cout << "Pushed 1\n";
cout << "Pushing 2\n";
pq.push(2);
cout << "Pushed 2\n";
while (!pq.empty())
{
cout << "Popped = " << pq.top() << '\n';
pq.pop();
}
return 0;
}
Но выход странный!!
ВЫХОД
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Pushing 1
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Pushed 1
Pushing 2
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Pushed 2
Popped = 1
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Popped = 2
Copy Constructor Called!
Почему конструктор копирования вызывается так много раз для каждой операции push и pop?
Также без какой-либо операции push или pop, когда я только что объявил priority_queue
, конструктор копирования вызывается 4 раза.
Почему это происходит? Разве не правильно, что priority_queue хранит объект класса компаратора и использует его всякий раз, когда необходимы сравнения?
std::make_heap
принимает компаратор по значению см. , как и многочисленные внутренние функции в libstdc++
реализации make_heap
. libc++
делает меньше передачи по значению, но кое-что делает.
Компараторы должны быть дешевыми для копирования. Если им нужны внешние данные, заставьте их хранить указатель на внешние данные.
Вы должны вывести значение
this
, а не просто «Вызван конструктор копирования!».