首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ STL make_heap和pop_heap不工作

C++ STL make_heap和pop_heap不工作
EN

Stack Overflow用户
提问于 2010-05-12 05:26:06
回答 4查看 3K关注 0票数 4

我需要使用一个堆,所以我搜索了一下STL堆,但它似乎不起作用,我写了一些代码来解释我的意思:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>

struct data
{
    int indice;
    int tamanho;
};


bool comparator2(const data* a, const data* b)
{
    return (a->tamanho < b->tamanho);
}

int main()
{

        std::vector<data*> mesas;

        data x1, x2, x3, x4, x5;

        x1.indice = 1;
        x1.tamanho = 3;

        x2.indice = 2;
        x2.tamanho = 5;

        x3.indice = 3;
        x3.tamanho = 2;

        x4.indice = 4;
        x4.tamanho = 6;

        x5.indice = 5;
        x5.tamanho = 4;

        mesas.push_back(&x1);

        mesas.push_back(&x2);

        mesas.push_back(&x3);

        mesas.push_back(&x4);

        mesas.push_back(&x5);


        make_heap(mesas.begin(), mesas.end(), comparator2);

        for(int i = 0 ; i < 5 ; i++)
        {
            data* mesa = mesas.front();
            pop_heap(mesas.begin(),mesas.end());
            mesas.pop_back();

            printf("%d, %d\n", mesa->indice, mesa->tamanho);
        }

    return 0;
};

这就是我得到的:

代码语言:javascript
复制
4, 6
2, 5
1, 3
3, 2
5, 4

所以它不像堆一样工作,因为向量上的最大元素没有正确返回。

还是我做错了什么?

EN

回答 4

Stack Overflow用户

发布于 2010-05-12 05:28:44

您需要将comparator2传递给std::pop_heap,因为这是您创建堆的方式。否则,它将对指针使用默认的小于运算符,该运算符只是比较指针值。

票数 14
EN

Stack Overflow用户

发布于 2010-05-12 06:22:47

MSN的答案是正确的。但是,两个样式指南中任何一个都可以防止此错误:

  • 声明比较器在引用上工作,而不是像operator<那样在对象上工作。使用对象的vector,而不是指针。

bool comparator2(const data& a,const data& b) { return (a.tamanho < b.tamanho);}

你可能真的需要指针的向量,在这种情况下这并不适用。

  • 使用std::priority_queue (来自<queue>),它将pop_heappop_back捆绑在一起,记住你的比较器。这需要一个函数式比较器:

结构运算符{ bool comparator2 ()( const data& a,const data& b) { return (a.tamanho < b.tamanho);} };std::priority_queue,std::priority_queue struct优雅的方法是将此作为data的默认比较:

结构数据{ int indice;int tamanho;mesas.push(x1);好友布尔返回( const data& a,const data& b) {operator< (a.tamanho < b.tamanho);} };std::priority_queue mesas;a.tamanho

priority_queue还可以接受一个预先填充的未排序容器,它将复制该容器。

票数 1
EN

Stack Overflow用户

发布于 2010-05-12 06:03:10

std::set怎么样?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <set>

struct data
{
    // Always put constructors on.
    // When the constructor is finished the object is ready to be used.
    data(int i,int t)
        :indice(i)
        ,tamanho(t)
    {}

    int indice;
    int tamanho;

    // Add the comparator to the class.
    // Then you know where to look for it.
    bool operator<(data const& b) const
    {
        return (tamanho < b.tamanho);
    }
};



int main()
{

        std::set<data> mesas;

        // Dont declare all your variables on the same line.
        // One per line otherwise it is hard to read.
        data x1(1,3);
        data x2(2,5);
        data x3(3,2);
        data x4(4,6);
        data x5(5,4);

        mesas.insert(x1);
        mesas.insert(x2);
        mesas.insert(x3);
        mesas.insert(x4);
        mesas.insert(x5);
        // You don't actually need the variables.
        // You could have done it in place.
        mesas.insert(data(6,100));

        // Use iterator to loop over containers.
        for(std::set<data>::iterator loop = mesas.begin(); loop != mesas.end(); ++loop)
        {
            printf("%d, %d\n", loop->indice, loop->tamanho);
        }

    return 0;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2814575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档