在1.5.3节中使用了std::bind组合了多个函数,实现了计算集合中大于5小于10的元素个数的功能:
using std::placeholders::_1; // 查找集合中大于5小于10的元素个数 auto f = std::bind(std::logical_and<bool>(), std::bind(std::greater<int>(), _1, 5), std::bind(std::less_equal<int>(), _1, 10)); int count = std::count_if(coll.begin(), coll.end(), f); 通过使用lambda表达式,可以轻松地实现类似的功能: // 查找大于5小于10的元素的个数 int count = std::count_if(coll.begin(), coll.end(), [](int x){return x > 5 && x < 10;});
可以看到,lambda表达式比std::bind的灵活性更好,也更为简洁。当然,这都得益于lambda表达式的特征,它可以任意封装出功能闭包,使得短小的逻辑可以以最简洁清晰的方式表达出来。
比如说,我们这时候的需求变更了,只希望查找大于10,或小于10的个数:
// 查找大于10的元素的个数 int count = std::count_if(coll.begin(), coll.end(), [](int x){return x > 10;}); // 查找小于10的元素的个数 int count = std::count_if(coll.begin(), coll.end(), [](int x){return x < 10;});
不论如何去写,使用lambda表达式的修改量是非常小的,清晰度也很好。
lambda和std::function的效果是一样的,代码还更简洁了。一般情况下可以直接用lambda来代替function,但还不能完全替代,因为还有些老的库,比如boost的一些库就不支持lambda,还需要function。
C++11引入函数式编程的概念中的lambda,让代码更简洁,更灵活,也更强大,并提高了开发效率,提高了可维护性。