web-dev-qa-db-ja.com

std :: any_ofは短絡ロジックに従う必要がありますか?

次のコードを考えると、

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::any_of(std::begin(numbers), std::end(numbers), 
            [](int number) { return number > 3; } );

std :: any_ofは、4に達したらすぐに戻ることが(標準で)必要ですか?

29

標準自体はそのような厳しい要件を課していません。しかし、間接的に推奨されていると推測できます( [alg.any_of] ):

template <class InputIterator, class Predicate>
  bool any_of(InputIterator first, InputIterator last, Predicate pred);
template <class ExecutionPolicy, class ForwardIterator, class Predicate>
  bool any_of(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last,
              Predicate pred);

戻り値:[first、last)が空の場合、または範囲[first、last)に反復子iがない場合は、pred(* i )はtrue、それ以外の場合はtrueです。

複雑さ:せいぜい最後に-述語の最初のアプリケーション。

完全に準拠した実装では、述語を正確に適用できますlast-first回、私への言い回しは、できるだけ早く終了することが推奨されるように聞こえます。

ExecutionPolicyを受け入れるオーバーロードと同じものを尋ねることは事実上不可能であることに注意してください。それ以来、評価の順序は不明です。

それほど正式ではないが、述語が真の瞬間にしないない順次バージョンの実装は、作成者の資格情報を問題にします。

34
StoryTeller