测试值是否在向量中

时间:2015-04-30 15:41:46

标签: c++ vector iterator

我有一个班级,一个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是如何运作的。但我对所有方法都持开放态度。

3 个答案:

答案 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 *。