gpt4 book ai didi

c++ - lambda 签名 for_each + unordered_map

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:23 25 4
gpt4 key购买 nike

#include <unordered_map>
#include <string>
#include <iostream>
#include <algorithm>
#include <utility>

int main()
{
std::unordered_map<string, int> hash {{"a", 1}, {"b", 2}, {"c", 3}};

// CaseA(NO-ERROR)
std::for_each(hash.begin(), hash.end(),
[](const std::pair<string, int>& p) {
std::cout << p.first << " => " << p.second << endl;
}
);

// CaseB(NO-ERROR)
std::for_each(hash.begin(), hash.end(),
[](const std::pair<string, int> p) {
std::cout << p.first << " => " << p.second << endl;
}
);

// CaseC(NO-ERROR)
std::for_each(hash.begin(), hash.end(),
[](std::pair<string, int> p) {
std::cout << p.first << " => " << p.second << endl;
}
);

// CaseD(ERROR)
std::for_each(hash.begin(), hash.end(),
[](std::pair<string, int>& p) {
std::cout << p.first << " => " << p.second << endl;
}
);

}

Q1> 为什么 CaseD 是错误的?

Q2> CaseA真的是推荐的方式吗?

谢谢

最佳答案

value_type对于 std::unordered_map<K,V>std::pair<const K,V> (注意 const )。您不能绑定(bind) std::pair<K,V> 类型的引用到 std::pair<const K,V> 类型的对象.你应该使用 std::unordered_map<K,V>::value_type而不是试图直接拼写类型的名称,因为这将确保您不会弄错。

如果您想知道,案例 C 的工作原理是因为有一个构造函数可以实现类型转换,因此 p将是 std::unordered_map 中值的拷贝.

对于不打算修改容器中元素的 lambda,推荐方法是:

[](const std::unordered_map<std::string,int>::value_type& p)

在问题的前 3 种情况下,元素的拷贝已完成(性能受到影响)。从调用者的角度来看,情况 B 和 C 是相同的(在一个函数中,顶级限定符被删除),但从 lambda 定义的角度来看,情况 B 将确保您不会尝试修改参数(它本身就是源代码的拷贝)

关于c++ - lambda 签名 for_each + unordered_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306715/

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