Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::multimap转换为std::priority\u队列_C++_Stl_Priority Queue - Fatal编程技术网

C++ 将std::multimap转换为std::priority\u队列

C++ 将std::multimap转换为std::priority\u队列,c++,stl,priority-queue,C++,Stl,Priority Queue,我用std::multimap编写了一个函数,由于std::multimap的原因,这个函数的速度非常慢。经过分析,我意识到我只是将std::multimap用作堆,因此我尝试用只允许堆操作的std::priority_队列替换它,希望它能更快地用于此用途 当然,std::priority_queue的元素类型需要是std::pair,然后我将向std::priority_queue传递一个自定义比较器,仅通过对中的第一个值进行比较(这是std::multimap的实际键) 由于一切都是模板化的

我用
std::multimap
编写了一个函数,由于
std::multimap
的原因,这个函数的速度非常慢。经过分析,我意识到我只是将
std::multimap
用作堆,因此我尝试用只允许堆操作的
std::priority_队列
替换它,希望它能更快地用于此用途

当然,
std::priority_queue
的元素类型需要是
std::pair
,然后我将向
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>());
}
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\u queue
的所有成员函数的错误消息

谁能提出一个解决方案吗?

这是一个相当隐蔽的案子。换一行就行了
std::优先级队列
mypq(PQ比较(comp))

致:
std::优先级队列
mypq{PQ比较(comp)}

注意,我已经用
{}
更改了
()
。如果你不使用C++11,你应该加上额外的括号,也就是说,把它设为
mypq((pqcomparison(comp))

这是一个很好的屏蔽。换一行就行了
std::优先级队列
mypq(PQ比较(comp))

致:
std::优先级队列
mypq{PQ比较(comp)}


注意,我已经用
{}
更改了
()
。如果你不使用C++11,你应该加上额外的括号,即使其
mypq((pqcomparison(comp))

我必须将代码复制到MSDEV中才能看到区别!:-)也许你可以添加一个注释,让它更明显?@Stefan我想你是对的,更新了我的答案clarity@magor非常感谢你!我不敢相信我又爱上了最烦人的解析。。。我知道,但在这里我就是看不到。我必须将代码复制到MSDEV中才能看到区别!:-)也许你可以添加一个注释,让它更明显?@Stefan我想你是对的,更新了我的答案clarity@magor非常感谢你!我不敢相信我又爱上了最烦人的解析。。。我知道,但在这里我就是看不到。我想问为什么std::multimap比std::priority_队列慢。我想问为什么std::multimap比std::priority_队列慢。