这个问题是来自another topic灵感这对这样一个问题:我怎样才能使std :: find_if和std :: map一起使用一些boost库?
找到的第一个值不是用户指定的值从地图容器
这可以通过多种方式来解决更大。一个典型的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 &
作为参数。我的直觉感受告诉我,提升有这个解决方案。 :-)
你只想要查找的值(在这种情况下的http:// www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/map_values.html是答案),或者是整个关键字,值对的迭代器,其中值满足谓词? – Cubbi
@Cubbi:如果这不适用于返回地图的迭代器的'std :: find_if',那不是答案。 – Nawaz
@Nawaz:我不知道是否需要std :: find_if。如果没有,我会去http://www.cplusplus.com/reference/stl/map/upper_bound/这应该是更快,只有一个简单的代码行。 –