向量查找错误:“ struct std :: iterator_traits”中没有名为“ iterator_category”的类型

时间:2018-11-30 08:50:13

标签: c++ vector

myVector是向量节点。每个节点都有一个int值和一个字符串指针名称。我正在尝试制作一个简单的函数,该函数将确定此向量中的任何节点是否具有此名称。

""

运行此命令时,出现错误“在“ struct std :: iterator_traits”中没有名为“ iterator_category”的类型”。我猜想这与指针的设置有关,但是我不确定这将是什么或该错误意味着什么。有人可以向我解释吗?

1 个答案:

答案 0 :(得分:2)

您正在使用算法,并且begin() / end()成员函数不正确。首先,

*myVector.end()

已经是未定义的行为,因为所有容器end()函数都返回一个过去时,即不可取消引用的迭代器。取消引用它会导致UB。

第二,std::find呼叫应为

const auto it = std::find_if(myVector.cbegin(), myVector.cend(),
    [&found](const Node *n){ return n->name() == found; });

您需要指定一个自定义谓词-这里是一个lambda表达式-因为find算法只能遍历节点,而不能遍历节点的名称,因此,您必须通过调用{ {1}}并将其与Node::name()进行比较。

让我添加一些其他说明:

  • 要传递自定义谓词,您需要使用found而不是std::find_if算法。
  • 由于容器不会被修改,因此我使用了std::findcbegin()函数。
  • 使用迭代器的类型推导(cend())被广泛接受并简化了其使用。
  • 您可能需要改善命名。 auto可以是it,而firstMatchingNode例如found
  • 如果您仅对是否存在至少一个匹配的节点名称感兴趣,请考虑使用具有相同谓词的std::any_of。这更接近您的意图,因为它丢弃了比赛的位置。