这个问题的灵感来自另一个提出这个问题的话题:
从地图容器中查找大于用户指定值的第一个值
这可以通过多种方式解决。典型的 C++03 解决方案定义了一个专用函数(或函子)并将其std::find_if
作为第三个参数传递。
在 C++11 中,可以避免定义专用函数(或仿函数),而是可以使用lambda
如下:
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
这是公认的答案。
我仍在寻找一个简短而酷的解决方案。如果它是一个向量,那么我刚刚学习了一个很酷的解决方案,它利用Boost.Phoenix
并且解决方案变得非常简洁(ideone demo):
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
这arg1
是在boost::phoenix::arg_names
命名空间中定义的仿函数对象,表达式arg1>4
计算为另一个仿函数,然后传递给std::find_if
.
快速测试是(ideone),
std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1
//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<< f(v) << std::endl; //prints 0 if as v > 9 is false, else 1
我的问题是,我想以类似的方式解决地图问题。有没有这样的解决方案?就像是:
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
或者,
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
为了使它起作用,表达式at<1>(arg1) > 2
必须计算为一个以const std::pair &
作为参数的函子。我的直觉告诉我 boost 有这个解决方案。:-)