make_heap没有堆积

时间:2011-03-30 18:19:12

标签: c++ data-structures heapsort

我有一个程序可以在向量中包含另一个向量的子集,作为对索引的引用。

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

这个比较课程有用吗?

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

Compare是包含knowledgeBase的类中的嵌套类,因此我可以访问变量,但是workSet.front();

永远不会返回引用最小值的索引。

我做错了什么?如果需要,我可以发布更多代码(其中包含我无法测试的其他无关错误,因为这不起作用)但我确实知道我的make_heap没有创建我想要的堆。

如果我正在做一些非常愚蠢的事情,我的make_heap调用如下:

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

编辑:bar是foo :: set internal to foo的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.

发生了什么事?

我意识到这远远超出了我的主要问题的范围,并且我已经给出了代码中没有定义的部分,但是我已经在这个问题上工作了六个小时,现在仍然没有想法发生了什么。

2 个答案:

答案 0 :(得分: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;
}

抱歉浪费任何人的时间。

答案 1 :(得分:0)

你没有忘记调整你的工作尺寸吗?例如,使用reserve然后使用operator[]不会增加向量的实际大小,因此make_heap将无操作。