推送、弹出和基本堆
push, pop, and basic heap
当我乱搞时提出的简单问题CPP 首选项并更改pop_heap
std::vector<int> v { 60 , 20 , 50 , 10 , 5 , 30 , 45 };
std::make_heap(v.begin(), v.end());
std::cout << "v: ";
for (auto i : v) std::cout << i << ' ';
std::cout << 'n';
std::pop_heap(v.begin(), v.end()); // moves the largest to the end
The result is:
v: 60 20 50 10 5 30 45
after pop_heap: 50 20 45 10 5 30 60
CPP参考告诉我
std::p op_heap-交换位置中的值和位置 last-1 中的值,并使子范围 [first, last-1( 成为最大堆。这具有从范围 [first, last] 定义的堆中删除第一个(最大(元素的效果。
我知道我错过了一些东西,因为如果我阅读第一个和最后一个会被交换。我知道在一切都说完并完成之后,pop_heap将消除 60,但订单最终如何以它的方式结束。我认为我不明白的是最后 1 个,但我不能确定
在std::pop_heap
中,您将first
指定为 v.begin()
,这将返回一个指向第一个元素的迭代器,last
作为v.end()
,根据 cplusplus.com"返回引用向量容器中过去结束元素的迭代器。这意味着last-1
实际上是向量中的最后一个元素。所以交换的元素是第一个(60
(和最后一个(45
(。之后子范围 [first
, last-1
(,意味着除了最后一个元素(现在60
(之外的所有元素再次被制成heap
,这意味着第一个元素是最大的(50
(。
因此,对于顺序,保证向量中的第一个元素是50
,最后一个元素是60
。至于其余的,cpppreferences在注释中指出:
最大堆是具有以下属性的一系列元素 [f,l(:
- *f 是该系列中最大的元素
- 可以使用 std::p ush_heap(( 添加新元素
- 第一个元素可以使用 std::p op_heap(( 删除
元素的实际排列是实现定义的。
因此,其余的只是以一种方便实现方法的方式排列。
就像它说的,first
换成last - 1
然后做类似std::make_heap(first, last - 1)
注意:first
和last
是std::pop_heap
的2个参数,分别是您的v.begin()
和v.end()
。这意味着它将在您的示例中交换v.begin()
和v.end() - 1
。
请参阅此示例
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 将 std::thread by 值推送到列表中
- std::矢量保存 只推送最后一个元素
- 当将值推送到矢量时,什么也没发生
- 创建动态对象并将其推送到矢量中
- 制作一对共享指针并推送一个向量
- 尝试将 sf::Texture* 推送到 std::vector 时出错
- 使用泛型类型推送到堆栈时出现问题
- C++ 按引用或值推送的并发队列
- 如何将 STL 队列推送函数绑定到 std::函数?
- 将值推送到 getter 函数调用的列表中时出现问题
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 将unique_ptrs从映射推送到矢量时出错
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 程序在为链表创建推送函数时崩溃
- C++:如何将unique_ptr推送到deque
- JNI、C++在堆栈中推送字符串
- 将字符串推送到私有成员向量