Arrayのincludes_if()が便利【OpenSiv3D】
Siv3Dの動的配列Array。OpenSiv3Dになって追加された関数の1つにincludes_if()があります。
指定した条件を満たす要素が配列に含まれているかbool型で返す関数です。
この関数を使えばstd::find_if()またはstd::any_ofで書いていたものが短いコードで書けるようになります。
サンプル
# include <Siv3D.hpp> struct Profile { Profile() {}; Profile(String n, float f) : name(n), debut(f) {} String name; //名前 float debut; //初登場作品のナンバリング }; void Main() { Array<Profile> profiles{ { U"霊夢", 1.0 } ,{ U"菫子",14.5 } ,{ U"ネムノ", 16.0 } }; auto lamda = [](Profile p) {return p.name == U"霊夢"; }; //includes_if()---------------------------------------------------------------------------------- bool includes_reimu1 = profiles.includes_if(lamda); Print << U"霊夢(includes_if()) = " << includes_reimu1; //std::find_if()---------------------------------------------------------------------------------- bool includes_reimu2 = std::find_if(profiles.begin(), profiles.end(), lamda) != profiles.end(); Print << U"霊夢(std::find_if()) = " << includes_reimu2; //std::any_of()---------------------------------------------------------------------------------- bool includes_reimu3 = std::any_of(profiles.begin(), profiles.end(), lamda); Print << U"霊夢(std::any_of()) = " << includes_reimu3; while (System::Update()) { } }
実行結果
霊夢(includes_if()) = true
霊夢(std::find_if()) = true
便利な関数がどんどん増えていく
イテレータがほしいときはstd::find_if()が必要ですけど、有るか無いか知りたいだけのときはいちいちbigin()だend()だ書かなくて済むのでいいですね。
2018年3月7日追記
std::any_ofの存在を忘れてました。
よって書き足し。includes_if()のほうが便利なのは相変わらずです。