矢量查找错误:"struct-std::iterator_traits"中没有名为"ite


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'的类型"。我猜这与指针的设置有关,但我不确定这会是什么,也不确定这个错误意味着什么。有人能给我解释一下吗?

您错误地使用了算法和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()cend()函数,因为容器不会被修改
  • 对迭代器使用类型推导(auto(被广泛接受并简化了它们的使用
  • 您可能需要改进命名。it可以是firstMatchingNode,而found例如是lookupName
  • 如果您只关心是否至少有一个匹配的节点名,请考虑具有相同谓词的std::any_of。这更接近你的意图,因为它放弃了比赛的位置

最新更新