繁体   English   中英

make_heap不堆

[英]make_heap not making heaps

我有一个程序可以对向量中另一个向量的子集进行堆排序,以作为对索引的引用。

std::vector<foo> knowledgeBase;
std::vector<int> workingSet;

这个比较类有用吗?

class Compare
{
    bool operator()(int lft, int rgt)
    {
        return knowledgeBase[lft].bar() > knowledgeBase[rgt].bar();
    }
};

Compare是包含知识基础的类中的嵌套类,因此我可以访问变量,但是引用最小值的索引永远不会由workingSet.front()返回。

我究竟做错了什么? 如果需要的话,我可以发布更多代码((这些代码还有其他一些无关的错误,我无法测试,因为这不起作用),但我可以肯定地知道我的make_heap不会创建我想要的堆。

万一我做的事情很愚蠢,我的make_heap调用如下:

std::make_heap(workingSet.begin(), workingSet.end(), Compare());

编辑:bar是foo内部std :: set的size()。 这个集合不是空的,也不是未定义的,因为我可以输出它的内容(并验证它们是否正确)。 虽然那是使用迭代器...这还不够吗?

Edit2:经过进一步的研究,我发现bar()总是返回1。我添加了一个int,并且每次添加变量时都将其递增,就像这样……

foo::foo()
{
    siz = 0;
}

void foo::addLiteral(std::string var, bool truth)
{
    literals.insert(Literal(var,truth)); 
    ++siz;
}

class foo()
{
public:
    foo();
    void addLiteral(std::string var, bool truth);
    bool bar(){return siz;}
private:
    int siz;
    std::set<Literal, LiteralComp> literals;
}

foo初始化如下:

...
   foo newClause;
    ss.str(input);
    ss >> variable;
    while(!ss.fail())
    {
        if(variable[0] == '~')
        {
            variable = variable.substr(1);
            truth = false;
        }
        else truth = true;
        newClause.addLiteral(variable, truth);
        ss >> variable;
    }
    knowledgeBase.push_back(newClause);
workingSet.push_back(count++);
...

并且foo.size()仍然始终返回1。

到底是怎么回事?

我意识到这超出了我的主要问题的范围,并且我给出的代码中还没有定义一些片段,但是我已经在这个问题上工作了大约六个小时,现在仍然不知道要怎么做上。

...我现在觉得很蠢。

class foo()
{
public:
    foo();
    void addLiteral(std::string var, bool truth);
    bool bar(){return siz;} <==== returns a bool
private:
    int siz;
    std::set<Literal, LiteralComp> literals;
}

很抱歉浪费任何人的时间。

您没有忘记确定工作集的大小,对吗? 例如,使用reserve然后使用operator[]不会增加向量的实际大小,因此make_heapmake_heap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM