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

时间:2013-09-20 09:45:53

标签: c++ stl priority-queue

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

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

1 个答案:

答案 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)))