我有一个程序可以在向量中包含另一个向量的子集,作为对索引的引用。
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.
发生了什么事?
我意识到这远远超出了我的主要问题的范围,并且我已经给出了代码中没有定义的部分,但是我已经在这个问题上工作了六个小时,现在仍然没有想法发生了什么。
答案 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
将无操作。