【问题标题】:understanding std::find_if() using a lamda on std::pair在 std::pair 中使用 lambda 理解 std::find_if()
【发布时间】:2018-11-28 17:15:16
【问题描述】:

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

有人能解释一下为什么没有像 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;
}

【问题讨论】:

  • 再次计算括号。 -&gt;second 取消引用由std::find_if 返回的迭代器,它指向一对,并访问该对的second 成员。

标签: c++ c++11 find c++-standard-library


【解决方案1】:

据我了解,下面的std::find_if() 返回一个迭代器

是的,但是该迭代器随后在同一个表达式中被取消引用。该函数从args_ 的某个元素返回std::type_index副本,该元素可能是带有value_typestd::pair&lt;std::string, std::type_index&gt;(或类似)的类似std 的容器。

猜测是std::vector&lt;std::pair&lt;std::string, std::type_index&gt;&gt;,因为如果它是一个地图,整个函数可以简化为

return args_.at(name);

有人能解释一下为什么没有像 std::pair&lt;std::string, std::type_index&gt;::iterator = std::find_if(...) 这样定义的迭代器吗?

首先std::pair 没有成员iterator。我假设您的意思是std::vector&lt;std::pair&lt;std::string, std::type_index&gt;&gt;::iterator(或args_ 的任何集合类型)。

不需要单独的声明来声明这样的迭代器,就像在声明中不需要单独的 double 一样

return floor(3.14 * radius);

当您需要整数周长计算时。

std::find_if()返回的迭代器存放在哪里

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

你怎么能自己打电话给-&gt;second

你不是。你在std::find_if返回的临时调用它

为什么std::find_if 的右大括号后面有一个!= args_.end()

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

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2012-08-14
    • 2013-04-28
    • 2016-06-13
    • 1970-01-01
    • 2021-03-15
    • 2016-10-01
    • 2013-03-08
    相关资源
    最近更新 更多