gpt4 book ai didi

c++ - make_heap 不堆

转载 作者:行者123 更新时间:2023-11-28 08:22:00 34 4
gpt4 key购买 nike

我有一个程序将另一个 vector 的子集堆排序到一个 vector 中,作为对索引的引用。

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 的类中的嵌套类,因此我可以访问变量,但 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;
}

很抱歉浪费了大家的时间。

关于c++ - make_heap 不堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5490447/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com