Я все еще не уверен насчет приоритетной очереди в STL. Вот цель, которую я хочу достичь, скажем: у меня есть структура с именем Record, которая содержит строковое слово и счетчик int. Например: у меня есть много записей об этом (в примере программы, только 5), теперь я хочу сохранить лучшие N записей (в примере, 3).
Теперь я знаю, что могу перегрузить оператор <в записи и поместить все записи в вектор, а затем инициализировать priority_queue следующим образом: </p>
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:
Спасибо за ваш вклад, теперь у меня все получилось. Однако я предпочел бы, если бы кто-то мог объяснить, почему первая версия оператора <перегрузки работает, вторая (закомментированная) не будет работать и имеет длинный список ошибок компилятора. </p>
friend bool operator< (const Record& lhs, const Record& rhs)
{
return lhs.count>rhs.count;
}
/*
bool operator<(const Record& rRecord)
{
return this->count>rRecord.count;
}
*/