C++ 将std::multimap转换为std::priority\u队列
我用C++ 将std::multimap转换为std::priority\u队列,c++,stl,priority-queue,C++,Stl,Priority Queue,我用std::multimap编写了一个函数,由于std::multimap的原因,这个函数的速度非常慢。经过分析,我意识到我只是将std::multimap用作堆,因此我尝试用只允许堆操作的std::priority_队列替换它,希望它能更快地用于此用途 当然,std::priority_queue的元素类型需要是std::pair,然后我将向std::priority_queue传递一个自定义比较器,仅通过对中的第一个值进行比较(这是std::multimap的实际键) 由于一切都是模板化的
std::multimap
编写了一个函数,由于std::multimap
的原因,这个函数的速度非常慢。经过分析,我意识到我只是将std::multimap
用作堆,因此我尝试用只允许堆操作的std::priority_队列
替换它,希望它能更快地用于此用途
当然,std::priority_queue
的元素类型需要是std::pair
,然后我将向std::priority_queue
传递一个自定义比较器,仅通过对中的第一个值进行比较(这是std::multimap
的实际键)
由于一切都是模板化的,我。。我迷路了,需要帮助。我制作了一个示例代码:
带有std::multimap的示例
template <typename Compare>
void littleTestFunction(Compare comp){
std::multimap<int,int,Compare> testMap(comp);
testMap.insert(std::make_pair(1,5));
testMap.insert(std::make_pair(1,6));
testMap.insert(std::make_pair(2,7));
for (; !testMap.empty(); ){
std::cout << testMap.begin()->second << std::endl;
testMap.erase(testMap.begin());
}
return;
}
int main(void){
littleTestFunction(std::less<int>());
}
template <typename Compare>
class pqcomparison{
private:
Compare myComp;
public:
pqcomparison(Compare &cmp){
myComp = cmp;
}
bool operator() (const std::pair<int, int> &lhs,
const std::pair<int, int> &rhs){
return myComp(rhs.first, lhs.first);
}
};
template <typename Compare>
void littleTestFunction(Compare comp){
std::priority_queue<std::pair<int, int>,
std::vector<std::pair<int, int> >,
pqcomparison<Compare> >
mypq(pqcomparison<Compare>(comp));
mypq.push(std::make_pair(1,5));
mypq.push(std::make_pair(1,6));
mypq.push(std::make_pair(2,7));
for (; !mypq.empty(); ){
std::cout << mypq.top().second << std::endl;
mypq.pop();
}
return;
}
当我只编译std::priority_queue
声明时,我没有得到任何错误。但是,当我尝试编译整个函数时,会收到关于std::priority\u queue
的所有成员函数的错误消息
谁能提出一个解决方案吗?这是一个相当隐蔽的案子。换一行就行了
std::优先级队列
mypq(PQ比较(comp))代码>
致:
std::优先级队列
mypq{PQ比较(comp)}代码>
注意,我已经用{}
更改了()
。如果你不使用C++11,你应该加上额外的括号,也就是说,把它设为mypq((pqcomparison(comp))
这是一个很好的屏蔽。换一行就行了
std::优先级队列
mypq(PQ比较(comp))代码>
致:
std::优先级队列
mypq{PQ比较(comp)}代码>
注意,我已经用{}
更改了()
。如果你不使用C++11,你应该加上额外的括号,即使其mypq((pqcomparison(comp))
我必须将代码复制到MSDEV中才能看到区别!:-)也许你可以添加一个注释,让它更明显?@Stefan我想你是对的,更新了我的答案clarity@magor非常感谢你!我不敢相信我又爱上了最烦人的解析。。。我知道,但在这里我就是看不到。我必须将代码复制到MSDEV中才能看到区别!:-)也许你可以添加一个注释,让它更明显?@Stefan我想你是对的,更新了我的答案clarity@magor非常感谢你!我不敢相信我又爱上了最烦人的解析。。。我知道,但在这里我就是看不到。我想问为什么std::multimap比std::priority_队列慢。我想问为什么std::multimap比std::priority_队列慢。