我有一个班级,一个operator==
,一个班级Graph
,其中包含Board*
(让我们称之为标签)和vector<Graph*>
(儿童)。
我有2 vector<Graph*>
,名为open and closed。
我如何查看已打开元素中的每个子节点,如果此子节点尚未关闭,则将子节点添加到打开状态?
这是我的尝试,但它没有编译。
for (vector<Graph*>::iterator itr = opened[0]->getchildren().begin(); itr != opened[0]->getchildren().end(); ++itr) {
// this doesn't compile
vector<Graph*>::iterator it = find(closed.begin(), closed.end(), *itr);
if(it != closed.end())
{
opened.push_back(*it);
}
}
我明白了:
没有用于调用
的匹配函数'find(std::vector<Graph*>::iterator, std::vector<Graph*>::iterator, Graph*&)'
我真的不明白std::find
是如何运作的。但我对所有方法都持开放态度。
答案 0 :(得分:4)
std::find
返回迭代器,而不是指向迭代器的指针:
vector<Graph*>::iterator* it = NULL;
↑
// that line doesn't compile
it = find(closed.begin(), closed.end(), (*itr)->tab);
你的it
是一个指针。您只需要实际的迭代器类型:
vector<Graph*>::iterator it = find(...);
您不是通过与NULL
进行比较来检查有效性,而是通过与传入的结束迭代器进行比较来检查有效性:
if (it != closed.end())
{
...
}
鉴于您刚刚提供的错误,问题是find()
正在使用operator==
查找特定值。您正在寻找Board*
向量中的Graph*
。这两者无法比较 - 你只能寻找Graph*
。除非您正在寻找Graph*
包含 Board*
,否则您需要通过std::find_if
答案 1 :(得分:1)
关于find
,您必须检查end
迭代器
it = find(closed.begin(), closed.end(), (*itr)->tab);
if (it != closed.end())
{
...
答案 2 :(得分:1)
除了将它与NULL而不是closed.end()进行比较的明显错误之外,您似乎想要查找Graph *类型的节点。
std :: find(start,finish,key)使用从头到尾的迭代器,并在每个元素上对&#39; key&#39;调用operator ==。事情&#39;存储在矢量和键中必须是相同类型。编译器报告他们不是。
Key是Board *类型,而vector元素是Graph *。