sách gpt4 ai đã đi

Tại sao tôi cần phải truyền bộ so sánh để xây dựng priority_queue khi nó là lambda, nhưng không cần truyền khi nó là std::greater?

In lại Tác giả: Space Dog 更新时间:2023-10-29 23:23:53 33 4
mua khóa gpt4 Nike

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

#include 
#include
#include
#include

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

int chính() {
std::priority_queue q;

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

print_queue(q);

std::priority_queue, std::greater > 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, 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, std::greater > q2;

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

std::priority_queue, std::greater > q2(std::greater());

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

1 Câu trả lời

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

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

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

33 4 0
Bài viết được đề xuất: c++ - (a==1)&&(a==2)&&(a==3) 可以计算为真吗? (它有用吗?)
Bài viết được đề xuất: c++ - 为什么数组 的元素的默认初始化需要 C++14?
Bài viết được đề xuất: c++ - 返回一个参数被评估的函数
Bài viết được đề xuất: c++ - 你为什么不能移动 uint16_t
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com