Я все еще запутался в очереди приоритетов в STL. Вот цель, которую я хочу достичь, скажем: у меня есть структура под названием «Запись», которая содержит строковое слово и счетчик int. Например: у меня много записей о них (в примерной программе всего 5), теперь я хочу сохранить верхние N записей (в примере 3).инициализация для очереди приоритетов STL
теперь я знаю, что я мог бы перегрузить оператор < в записи, и поставить все записи в векторе, а затем инициализировать priority_queue как:
priority_queue< Record, vector<Record>, less<Record> > myQ (myVec.begin(),myVec.end());
Однако, как я понял, это не так легко контролировать размер вектора myVec, потому что он не отсортирован так, как я хотел.
Я действительно не понимаю, почему следующее не может работать:
struct Record
{
string word;
int count;
Record(string _word, int _count): word(_word), count(_count) { };
/*
bool operator<(const Record& rr)
{
return this->count>rr.count;
}
*/
bool operator() (const Record& lhs, const Record& rhs)
{
return lhs.count>rhs.count;
}
};
void test_minHeap()
{
priority_queue<Record> myQ;
Record arr_rd[] = {Record("William", 8),
Record("Helen", 4),
Record("Peter", 81),
Record("Jack", 33),
Record("Jeff", 64)};
for(int i = 0; i < 5; i++)
{
if(myQ.size() < 3)
{
myQ.push(arr_rd[i]);
}
else
{
if(myQ.top().count > arr_rd[i].count)
continue;
else
{
myQ.pop();
myQ.push(arr_rd[i]);
}
}
}
while(!myQ.empty())
{
cout << myQ.top().word << "--" << myQ.top().count << endl;
myQ.pop();
}
}
Edit: Спасибо за ваш вклад, теперь я получил его working.However, я предпочитаю, если кто-то может объяснить, почему первый вариант оператора <, перегрузка работает, вторая (прокомментированная) не будет работать и имеет длинный список ошибок компилятора.
friend bool operator< (const Record& lhs, const Record& rhs)
{
return lhs.count>rhs.count;
}
/*
bool operator<(const Record& rRecord)
{
return this->count>rRecord.count;
}
*/
Вы понимаете, что у вас нет 'operator <' перегружен для 'Record' - он закомментирован. –
, потому что я не хочу идти 1-й способ в своем посте. Я перегружаю operator() вместо – WilliamLou
'operator()' является оператором функции-вызова, и вы перегружаете его, что делает нулевой смысл. Если вы хотите заказать объекты, перегрузите соответствующий оператор сравнения. –