STL 中的最小堆,不带比较器
min heap in stl without comparator
我刚刚开始使用STL,目前正在经历堆。 我只是想知道是否有办法在没有比较器的情况下在 c++/cpp 中实现最小堆。
我尝试了以下代码(来自geeksforgeeks的一些修改(:
#include<iostream>
#include<algorithm> // for heap
#include<vector>
using namespace std;
int main()
{
// initializing vector;
vector<int> vi = { 1, 6, 7, 9, 11, 4 };
make_heap(vi.end(), vi.begin()); // swapped the start and end points
cout << "The minimum element of heap is : ";
cout << vi.front() << endl;
}
输出为 :1
我也在其他测试用例中尝试过这个,它似乎工作正常。只是想知道这在逻辑上是否正确?这是一种好的做法吗?
首先,你的代码:
make_heap(vi.end(), vi.begin());
这会导致未定义的行为,因为vi.end()
是一个过去的迭代器。 即它不指向实际值,取消引用它是非法的。
我认为您正在尝试执行以下操作:
make_heap(vi.rbegin(), vi.rend());
但这行不通,因为生成的堆仍然是一个max_heap。
话虽如此,从评论中的讨论来看,OP 的问题实际上是"在 stl 中最小堆而不编写比较器",这是微妙的不同,并导致一个非常不同的答案。
STL提供了现成的模板化比较器来处理这些情况。原因是拥有更少、更灵活的算法会更干净。API 表面越低越好。
您所要做的就是:
make_heap(vi.begin(), vi.end(), std::greater<>());
相关文章:
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 比较器在 stl.
- 通过函数指针对类内的 STL SET 使用自定义比较器
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- STL 中的最小堆,不带比较器
- C++ STL . 自定义比较器如何工作?
- 是在STL中使用的COMP比较器是从未更改的STL比较比较STL中的对象
- 如何使用特定构造函数使用STL Priority_queue 比较器
- 为什么仅通过模板指定STL设置比较器
- 我们可以使用异构查找比较器对 STL 关联容器执行"partial-match"搜索吗?
- STD :: SET(或STD :: MAP)是否有一个提供基于值的查找的STL比较器?STD :: lands_les
- C - 如何正确地将比较器传递到STL功能
- STL 映射自定义比较器
- STL地图 - 何时使用自定义比较器
- 如何使用初始数据和自定义比较器声明 stl::p riority_queue
- STL中的比较器
- 为什么C++ STL 容器使用 "less than" 运算符<而不是 "equal equal" 运算符== 作为比较器?
- C++/STL默认比较器
- 如何编写带有中间变量的比较器以进行 stl 排序
- STL:用未构造的有状态比较器初始化容器