解释默认 priority_queue::top() 的行为?
Explain behavior of default priority_queue::top()?
std::priority_queue
默认使用std::vector<int>
和std::less
比较器。默认情况下,priority_queue 是最大堆。
docs for top() 状态:
The top element is the element that compares higher in the priority_queue
, and the next that is removed from the container when priority_queue::top
is called.
This member function effectively calls member front
of the underlying container object.
因此,默认构造的 priority_queue
整数构造如下:
auto maxheap = priority_queue<int>();
maxHeap.push(1);
maxHeap.push(3);
cout << maxHeap.top(); // outputs 3
但是,回到 top()
的描述,文档声明实际上调用了底层容器对象上的成员 front
。如果我创建一个向量并使用 std::less
来模拟我们的 maxHeap 的底层容器:
auto vec = vector<int>{3, 1};
sort(vec.begin(), vec.end(), less<int>()); // {1, 3}
cout << vec.front(); // outputs 1
因为std::less
按升序排序,调用vec.front()
最终返回最小值。
我对 priority_queue::top()
的默认行为和文档所说的理解有些脱节。有人可以给我解释一下吗?
你用错了算法,你可以在https://en.cppreference.com/w/cpp/container/priority_queue/priority_queue阅读
std::priority_queue
不使用 std::sort
,而是 std::make_heap
.
如果您也在您的示例中使用它,您会得到您期望的输出。
std::vector<int> queue{1, 3};
std::make_heap(queue.begin(), queue.end(), std::less<>{});
std::cout << queue.front() << '\n';
Output: 3
std::priority_queue
默认使用std::vector<int>
和std::less
比较器。默认情况下,priority_queue 是最大堆。
docs for top() 状态:
The top element is the element that compares higher in the
priority_queue
, and the next that is removed from the container whenpriority_queue::top
is called.This member function effectively calls member
front
of the underlying container object.
因此,默认构造的 priority_queue
整数构造如下:
auto maxheap = priority_queue<int>();
maxHeap.push(1);
maxHeap.push(3);
cout << maxHeap.top(); // outputs 3
但是,回到 top()
的描述,文档声明实际上调用了底层容器对象上的成员 front
。如果我创建一个向量并使用 std::less
来模拟我们的 maxHeap 的底层容器:
auto vec = vector<int>{3, 1};
sort(vec.begin(), vec.end(), less<int>()); // {1, 3}
cout << vec.front(); // outputs 1
因为std::less
按升序排序,调用vec.front()
最终返回最小值。
我对 priority_queue::top()
的默认行为和文档所说的理解有些脱节。有人可以给我解释一下吗?
你用错了算法,你可以在https://en.cppreference.com/w/cpp/container/priority_queue/priority_queue阅读
std::priority_queue
不使用 std::sort
,而是 std::make_heap
.
如果您也在您的示例中使用它,您会得到您期望的输出。
std::vector<int> queue{1, 3};
std::make_heap(queue.begin(), queue.end(), std::less<>{});
std::cout << queue.front() << '\n';
Output: 3