[英]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_heap
将make_heap
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.