将 std::multimap 转换为 std::priority_queue

2024-01-24

我有一个使用编写的函数std::multimap正是因为std::multimap。经过分析,我意识到我只使用了std::multimap as a heap,所以我尝试用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 to 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.

有人可以建议一个解决方案吗?


掩饰得相当好最麻烦的解析 http://en.wikipedia.org/wiki/Most_vexing_parse案件。只需更改这一行std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int> >, pqcomparison<Compare> > mypq(pqcomparison<Compare>(comp));

to: std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int> >, pqcomparison<Compare> > mypq{pqcomparison<Compare>(comp)};

注意我已经改变了() with {}。如果您不使用 C++11,您应该添加额外的括号,即使其mypq((pqcomparison<Compare>(comp)))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 std::multimap 转换为 std::priority_queue 的相关文章