0

我有一个使用std::multimap它编写的函数,正是因为std::multimap. 经过分析,我意识到我只是将std::multimap用作,因此我尝试将其替换为std::priority_queue仅允许堆操作的 a ,希望这种用法会更快。

当然,元素类型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.

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

4

1 回答 1

4

它很好地掩盖了最令人烦恼的解析案例。只需更改此行 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)))

于 2013-09-20T10:07:46.047 回答