我有一个使用std::multimap
编写的函数,由于std::multimap
,这个函数非常缓慢。经过分析,我意识到我只使用std::multimap
作为堆,所以我试图用std::priority_queue
替换它只允许堆操作,在希望这种用法更快。
当然,std::priority_queue
的元素类型需要std::pair<mmKey, mmValue>
,然后我会将自定义比较器传递给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>());
}
我尝试将std::multimap
转换为std::priority_queue
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_queue
的所有成员函数的错误消息。
有人可以建议一个解决方案吗?
答案 0 :(得分:4)
这是一个很好的掩盖most vexing parse案例。只需改变这一行
std::priority_queue<std::pair<int, int>,
std::vector<std::pair<int, int> >,
pqcomparison<Compare> >
mypq(pqcomparison<Compare>(comp));
于:
std::priority_queue<std::pair<int, int>,
std::vector<std::pair<int, int> >,
pqcomparison<Compare> >
mypq{pqcomparison<Compare>(comp)};
请注意,我已使用()
更改了{}
。如果你不使用C ++ 11,你应该加上额外的括号,即使它成为mypq((pqcomparison<Compare>(comp)))