Ari*_*Ari 6 c++ lambda bind c++11
假设我有A成员函数的类,int f() { return m_; }其中m_是数据成员.我有一个vector<A>被叫vec,我想m_在vec使用中找到具有最大价值的对象std::max_element.我可以用lambda做到这一点:
auto cmp = [] (A& x, A& y) { return x.f() < y.f(); };
A& max_elem = *std::max_element(vec.begin(), vec.end(), cmp);
Run Code Online (Sandbox Code Playgroud)
是否有一些bind(或某些这样的)技巧可以让我在没有lambda的情况下完成它并且不从头开始定义我自己的比较器?请不要建议更好的方法来解决最大发现问题.这只是一个例子.一般的问题是如何包装一个带有多个参数的函数对象(例如,std::less<int>我将用作上例中的比较器),使得发送给它的参数通过其他函数(或成员)在达到它之前.
Rei*_*ica 11
就在这里:
using namespace std::placeholders;
A& max = *std::max_element(begin(vec), end(vec)
, std::bind(
&std::less<int>::operator()
, std::less<int>()
, std::bind(&A::f, _1)
, std::bind(&A::f, _2)
)
);
Run Code Online (Sandbox Code Playgroud)
但是,如果我在代码审查中看到这一点,我会立即说"将丑陋变成一个lambda".
感谢@nm让代码可以缩短一点:
using namespace std::placeholders;
A& max = *std::max_element(begin(vec), end(vec)
, std::bind(
std::less<int>()
, std::bind(&A::f, _1)
, std::bind(&A::f, _2)
)
);
Run Code Online (Sandbox Code Playgroud)
不过,我仍然认为lambda更具可读性.请记住,您可以在调用中直接使用lambda max_element()(不需要cmp原始代码中的变量).
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |