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

标签 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;
}

最佳答案

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

是的,但是该迭代器随后在同一表达式中被取消引用。该函数返回 std::type_index拷贝来自 args_ 的一些元素,这大概是一些带有 value_type 的类似 std 的容器的 std::pair<std::string, std::type_index> (或类似)。

我猜这是一个 std::vector<std::pair<std::string, std::type_index>> ,因为如果它是一个 map ,整个功能可以简化为

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没有成员(member)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

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

how can you call ->second on its own

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

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

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

关于c++ - 在 std::pair 上使用 lambda 理解 std::find_if(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524807/

相关文章:

c++ - 异构初始化列表

c++ - unix下单进程 "top"命令计算Cpu百分比

c++ - 使用 MPI 和 C++ 从不同节点收集数据

bash - 编写一个 shell 脚本,在 1 行中查找并输出文件名和内容

php - 尝试使用正则表达式查找字母组

jquery - 使用 jQuery 获取链接文本(如果有)或图像的 id(如果是图像链接)

c++ - 编译时循环

c++ - std::map 声明 - 错误的模板

c++ - std::vector 不支持右值赋值

c++ - 函数返回如何返回特定计数