首页 > 解决方案 > 向量查找错误:'struct std::iterator_traits 中没有名为 'iterator_category' 的类型

问题描述

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

vector<Node*>::iterator it; 
it = std::find(*(*myVector.begin())->name, *(*myVector.end())->name, found);
if (it != myvector.end()) {
    return true;
}
return false;

当我运行它时,我收到错误“在 'struct std::iterator_traits 中没有名为 'iterator_category' 的类型”。我猜这与指针的设置有关,但我不确定那会是什么或这个错误意味着什么。有人可以向我解释吗?

标签: c++vector

解决方案


您错误地使用了算法和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算法只能遍历节点,而不是它们的名称,因此您必须通过调用Node::name()并将其与found.

让我添加一些额外的注释:

  • 为了能够传递自定义谓词,您需要std::find_if代替std::find算法。
  • 我已经使用了cbegin()andcend()函数,因为容器不会被修改。
  • 对迭代器使用类型推导 (the auto) 已被广泛接受并简化了它们的使用。
  • 您可能想改进您的命名。it可能是firstMatchingNodefound例如lookupName
  • 如果您只对是否存在至少一个匹配的节点名称感兴趣,请考虑std::any_of使用相同的谓词。这更接近您的意图,因为它丢弃了匹配的位置。

推荐阅读