gpt4 book ai didi

c++ - vector 查找错误:‘struct std::iterator_traits 中没有名为 ‘iterator_category’ 的类型

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:24 25 4
gpt4 key购买 nike

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

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使用相同的谓词。这更接近您的意图,因为它丢弃了匹配项的位置。

关于c++ - vector 查找错误:‘struct std::iterator_traits 中没有名为 ‘iterator_category’ 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53554145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com