Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';t sort\u heap按我期望的顺序放置元素?_C++_Heap - Fatal编程技术网

C++ 为什么';t sort\u heap按我期望的顺序放置元素?

C++ 为什么';t sort\u heap按我期望的顺序放置元素?,c++,heap,C++,Heap,给定以下代码: // range heap example #include <iostream> #include <algorithm> #include <vector> using namespace std; bool Greater(int a, int b) { if (a > b) { return true; } else { return false;

给定以下代码:

// range heap example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool Greater(int a, int b)
{
    if (a > b)
    {
        return true;
    } 
    else
    {
        return false;
    }
}

int main () {
    int myints[] = {10,20,30,5,15};
    vector<int> v(myints,myints+5);
    //vector<int>::iterator it;

    make_heap (v.begin(),v.end(), Greater);
    cout << "initial min heap   : " << v.front() << endl;

    pop_heap (v.begin(),v.end(), Greater); v.pop_back();
    cout << "min heap after pop : " << v.front() << endl;

    v.push_back(9); push_heap (v.begin(),v.end(), Greater);
    cout << "min heap after push: " << v.front() << endl;

    sort_heap (v.begin(),v.end());

    cout << "final sorted range :";
    for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];

    cout << endl;

    return 0;
}
//范围堆示例
#包括
#包括
#包括
使用名称空间std;
布尔更大(整数a、整数b)
{
如果(a>b)
{
返回true;
} 
其他的
{
返回false;
}
}
int main(){
int myints[]={10,20,30,5,15};
向量v(myints,myints+5);
//向量::迭代器;
使堆(v.begin(),v.end(),更大);

coutsort\u heap仅在根据提供的比较器对范围进行堆排序的情况下对其进行排序。由于在所有堆操作中都使用了“更大”作为比较器,因此根据默认比较器,您没有按堆顺序排列的元素,因此不能保证sort\u heap正常工作。常规排序算法应该可以正常工作,不是吗hough.

sort\u heap仅在范围按照提供的比较器进行堆排序时对其进行排序。由于在所有堆操作中都使用了“更大”作为比较器,因此您没有按照默认比较器进行堆排序的元素,因此不能保证sort\u heap正常工作。常规排序算法应该只在但是,ne。

与所有其他堆操作一样,您需要将
Greater
传递给
sort\u heap

sort_heap (v.begin(),v.end(), Greater);

正如@blastfunner提到的,
std::morerar()
比定义自己的函数更可取。除了优雅因素外,还有一个性能问题:当通过引用将函数传递给函子进行隐式转换时,它首先隐式转换为函数指针,这可能会由于间接分支指令而导致执行效率降低。

您需要与所有其他堆操作一样,s
Greater
sort\u heap

sort_heap (v.begin(),v.end(), Greater);

正如@blastfunner提到的,
std::morerar()
比定义自己的函数更可取。除了优雅因素外,还有一个性能问题:当通过引用将函数传递给函子进行隐式转换时,它首先隐式转换为函数指针,这可能会由于间接分支指令而导致执行效率降低。

这不是您的问题estion,但是
Greater()
可以实现为
返回a>b;
@Fred。这也是我看到这段代码后的第一个反应。@Fred:在这种情况下,使用
std::Greater()
比创建自己的比较函数更简单。这不是你的问题,而是
Greater()
可以实现为
返回a>b;
@Fred。这也是我看到这段代码后的第一个反应。@Fred:在这种情况下,使用
std::greater()
比创建自己的比较函数更简单。