我正在编写一个c ++优先级队列多地图类,它能够处理相同键值的多个项目。我有一个push方法,它将在multimap中创建项目,pop方法将返回具有最高键值的项目。我希望能够添加具有相同键值的多个项目。如果两个项具有相同的键值,则只应弹出一个,另一个应保留在队列中。
这是我的pop方法的代码。
string PQ::pop()
{
int maxKey = 0;
string maxValue;
if(pq.size() > 0)
{
for(std::multimap<int, string>::iterator iter = pq.begin(); iter != pq.end(); iter++)
{
if(iter->first >= maxKey)
{
maxKey = iter->first;
maxValue = iter->second;
}
}
}
else
{
maxValue = "The queue is empty";
}
pq.erase(maxKey);
return maxValue;
}
当我在main方法中运行此代码时:
pq.push(1, "one");
pq.push(3, "three");
pq.push(3, "three2");
pq.push(50, "fifty2");
pq.push(50, "fifty");
cout << pq.pop() << endl;
cout << pq.pop() << endl;
cout << pq.pop() << endl;
cout << pq.pop() << endl;
cout << pq.pop() << endl;
这是打印出来的:
fifty2 三 一个
应该是:
fifty2 五十 三 three2 之一。
答案 0 :(得分:0)
简而言之:pq.erase(maxKey)
使用等于maxKey
的键删除所有元素 - 而不仅仅是一个元素。
首先pop()
仅返回fifty2
,但同时删除fifty2
和fifty
,第二pop()
仅返回three
,但同时删除three
}和three2
,第三个pop()
返回并删除one
,第四个和第五个pop()
只返回空字符串。