C++ 构造堆模板类函数
我有一个模板函数,它接受一个向量并创建一个堆C++ 构造堆模板类函数,c++,C++,我有一个模板函数,它接受一个向量并创建一个堆 template<class T, class P> void construct_heap (vector <T>& v1, P pred) { make_heap(v1.begin(),v1.end()); sort_heap(v1.begin(),v1.end(),pred); } template void construct_heap(vector&v1,P pred) { 生成
template<class T, class P> void construct_heap (vector <T>& v1, P pred)
{
make_heap(v1.begin(),v1.end());
sort_heap(v1.begin(),v1.end(),pred);
}
template void construct_heap(vector&v1,P pred)
{
生成堆(v1.begin(),v1.end());
排序堆(v1.begin(),v1.end(),pred);
}
这适用于升序。当我传入construct_heap(v1,less())时;
它打印出正确的数据
但按降序排列。。它不好用。。我不明白为什么
有人能解释一下我做错了什么吗
谢谢
同时附上输出的图片
用于生成初始最大堆的谓词应与排序期间使用的谓词相同。下面是一个适用于所有随机访问容器的通用解决方案,用矢量和deque进行了演示
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <random>
template<class T, template<class,class...> class C, class P, class... Args>
void construct_heap(C<T,Args...>& v, const P& pred)
{
std::make_heap(std::begin(v), std::end(v), pred); // <<== same predicate
std::sort_heap(std::begin(v), std::end(v), pred);
}
template<class T, template<class, class...> class C, class... Args>
void print_seq(std::ostream& os, const C<T,Args...>& v)
{
for (auto x : v)
os << x << ' ';
os << '\n';
}
int main()
{
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<> dist(1,99);
std::vector<int> v1;
v1.reserve(25);
std::generate_n(std::back_inserter(v1), v1.capacity(),
[&](){ return dist(rng);});
print_seq(std::cout, v1);
std::deque<int> d1(v1.begin(), v1.end());
print_seq(std::cout, d1);
construct_heap(v1, std::greater<int>());
print_seq(std::cout, v1);
construct_heap(d1, std::greater<int>());
print_seq(std::cout, d1);
return 0;
}
您可以尝试将比较器谓词作为第三个参数传递给。只是说……您可以通过将
pred
传递到merge\u heap
来避免调用sort\u heap
。那你的问题就没有答案了。但正如@WhozCraig所指出的,您可能正在通过一辆小车pred
。您可以使用std::greater
,它肯定会起作用,因为您在这里处理的是整数。但是为什么要将第三个参数传递给那里的make_heap函数呢?。。那么,排序堆的意义是什么呢?@psj01基于相同比较器的初始最大值堆必须在排序堆
接管之前就位。如果你只是make_heap
那就是你所得到的;最大堆,在您的情况下,默认的比较器是std::less
,因为您没有指定它。“用于创建初始最大堆的谓词应该与排序过程中使用的predict相同。”-谢谢!!
16 6 52 81 7 95 72 76 40 68 9 77 66 73 44 7 64 44 3 58 89 24 51 43 26
16 6 52 81 7 95 72 76 40 68 9 77 66 73 44 7 64 44 3 58 89 24 51 43 26
95 89 81 77 76 73 72 68 66 64 58 52 51 44 44 43 40 26 24 16 9 7 7 6 3
95 89 81 77 76 73 72 68 66 64 58 52 51 44 44 43 40 26 24 16 9 7 7 6 3