了解std :: find_if()在std :: pair上使用lamda

时间:2018-11-28 17:15:16

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

据我了解,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;
}

1 个答案:

答案 0 :(得分:2)

  

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

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

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

return args_.at(name);
  

有人可以解释为什么没有定义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);

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

  

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

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

  

如何单独呼叫->second

不是。您正在std::find_if

返回的临时目录中调用它
  

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

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