理解 std::find_if() 在 std::pair 上使用 lambda

understanding std::find_if() using a lamda on std::pair

据我了解,std::find_if() below returns 指向 arg 范围内第一个元素的迭代器,其中第三个参数(lamda 函数) returns 为真.那是对的吗?

有人可以解释为什么没有这样定义的迭代器吗std::pair<std::string, std::type_index>::iterator = std::find_if(...)

std::find_if() 返回的迭代器存储在哪里?如何单独调用 ->second 而不是在迭代器上?

std::type_index argType(const std::string& name) const
{
    return std::find_if(args_.begin(), args_.end(),
        [&name](std::pair<std::string, std::type_index> arg)->bool
        {
            return arg.first == name;
        }
    )->second;
}

It is my understanding that std::find_if() below returns an iterator

是的,但是该迭代器随后在同一表达式中被取消引用。函数 return 是来自 args_ 的某个元素的 std::type_indexcopy,这大概是一些带有 [=15= 的类似 std 的容器] 的 std::pair<std::string, std::type_index>(或类似)。

猜测是 std::vector<std::pair<std::string, std::type_index>>,因为如果它是一个映射,整个函数可以简化为

return args_.at(name);

Could somebody explain why there isn't an iterator defined like this std::pair<std::string, std::type_index>::iterator = std::find_if(...)?

首先 std::pair 没有成员 iterator。我假设您的意思是 std::vector<std::pair<std::string, std::type_index>>::iterator (或 args_ 是哪个集合类型)。

不需要单独的语句来声明这样的迭代器,就像您不需要在语句

中单独的double一样
return floor(3.14 * radius);

当你想要整数周长计算时。

Where is the iterator returned by std::find_if() stored

编译器喜欢的任何地方。它仅在评估 return 语句时存在。

how can you call ->second on its own

你不是。您正在 std::find_if

编辑的临时 return 上调用它

and why is there a != args_.end() after the closing brace of std::find_if?

没有。作者 假设 他们会找到匹配的元素。如果他们不这样做,则该程序具有未定义的行为。这可能是故意的,也可能是一个错误。