绑定到本地变量的值是一个好习惯:
bool func(const std::string& a, const std::string& b)
{
return a + "abc" == b;
}
.........
auto str = getRandomString();
auto it = std::find_if(
vec.begin(),
vec.end(),
std::bind(func, str, std::placeholders::_1));
由于std::bind
返回值是一个函数对象,它为每个局部变量创建一个新的函数对象?我应该使用lambda表达式吗?
auto it = std::find_if(
vec.begin(),
vec.end(),
[str](const std::string& b){return str + "abc" == b;});
答案 0 :(得分:4)
你几乎总是喜欢使用lambda而不是std::bind
。首先,它不会遇到std::bind
所带来的潜在歧义;例如:
void foo(int a, std::string b);
void foo(Object a, std::string b);
std::bind(foo, std::placeholders::_1, some_string); // Which function is this binding?
(是的,你可以解决这个问题,但它真的很难看,需要明确的演员表。)
其次,lambda版本可能更快:最后它归结为正常的函数调用(可以内联)。 std::bind
通常使用另一个间接层(基本上是内部的函数指针),这会妨碍内联。
最后,您可以明确告诉lambda它应该如何存储其闭包变量(通过引用或按值)。这也可以使用std::bind
完成,但通常更难,需要std::cref
或std::ref
包装。
答案 1 :(得分:0)
两者都创建一个包含str
。
lambda稍微好一点,因为函数是一个成员函数,可以直接调用。 bind
存储一个函数指针,可能需要存储,并且可能必须间接调用,具体取决于优化器的好坏程度。