gpt4 book ai didi

c++ - 将 std::multimap 转换为 std::priority_queue

转载 作者:行者123 更新时间:2023-11-27 23:12:54 24 4
gpt4 key购买 nike

我有一个使用 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::multimapstd::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 的所有成员函数的错误消息。 .

有人可以提出解决方案吗?

最佳答案

掩饰得很好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)))

关于c++ - 将 std::multimap 转换为 std::priority_queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18913613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com