この質問は、この質問を提起する別のトピックから着想を得ています。
マップコンテナからユーザー指定値より大きい最初の値を検索します
これはいくつかの方法で解決できます。典型的なC++03ソリューションは、専用の関数(またはファンクター)を定義し、それをstd::find_if
3番目の引数として渡します。
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 &
私の腸の感覚は、ブーストがこの解決策を持っていることを教えてくれます。:-)