gpt4 book ai didi

c++ - 为什么我需要传递一个比较器来构造一个 priority_queue,当它是 lambda 时,而不是当它是 std::greater 时?

转载 作者:太空狗 更新时间:2023-10-29 23:23:53 30 4
gpt4 key购买 nike

我正在阅读来自 cppreference 的代码示例:

#include <functional>
#include <queue>
#include <vector>
#include <iostream>

template<typename T> void print_queue(T& q) {
while(!q.empty()) {
std::cout << q.top() << " ";
q.pop();
}
std::cout << '\n';
}

int main() {
std::priority_queue<int> q;

for(int n : {1,8,5,6,3,4,0,9,7,2})
q.push(n);

print_queue(q);

std::priority_queue<int, std::vector<int>, std::greater<int> > q2;

for(int n : {1,8,5,6,3,4,0,9,7,2})
q2.push(n);

print_queue(q2);

// Using lambda to compare elements.
auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1);};
std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp);

for(int n : {1,8,5,6,3,4,0,9,7,2})
q3.push(n);

print_queue(q3);

}

我不确定为什么 q2不需要初始化? IE。而不是拥有

std::priority_queue<int, std::vector<int>, std::greater<int> > q2;

在原始代码中,我想我们应该有类似的东西

std::priority_queue<int, std::vector<int>, std::greater<int> > q2(std::greater<int>());

那么为什么当我们有一个自定义的比较函数时,我们可以省略 q2 的初始化器?但不适用于 q3在代码示例中?

最佳答案

主要区别在于 std::greater 是默认可构造的,但闭包类型 (lambda) 不是。

因此,需要为队列提供一个 lambda 对象,以作为构造函数参数复制构造其比较器。

关于c++ - 为什么我需要传递一个比较器来构造一个 priority_queue,当它是 lambda 时,而不是当它是 std::greater 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50674506/

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