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