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
。这更接近你的意图,因为它放弃了比赛的位置