3

std::all_of( ) と std:none_of( ) は両方とも、空のコンテナに対して true を返します。

これの概念的な側面について議論することは別として、コンテナが空であるかどうかを常にチェックし、all_of または none_of をチェックする必要のないイディオムを誰かが提案できますか?

これは、空のコンテナーの両方のアルゴリズムで同じ述語を使用すると、その述語が要素の ALL と NONE の両方に対して true であることを示すという点で厄介です。したがって、(空の) ベクトルは all_of "odd"、all_of "even"、none_of "odd"、および none_of "even" です。

より実用的なレベルでは、「処理の準備ができている」などのアイテムのコレクションのステータスをチェックし、空のコレクションが「いいえ、処理できる要素がありません」に対応することを期待しています。空かどうかを個別に確認できることはわかっていますが、他の可能性を探しています。

4

2 に答える 2

16

より実用的なレベルでは、アイテムのコレクションのステータスをチェックするという観点から考えています。たとえば、「処理の準備ができています」など、空のコレクションは「いいえ、処理の準備ができている要素はありません」に対応することを期待しています。

そのため、空のコレクションが返されます。std::any_of()false

質問が「すべてのアイテムの処理が終了しましたか?」である場合、予想される回答は「はい、すべてが終了しました」です。そもそも処理するアイテムがなかった場合(そのstd::all_of()場合)。

同様に、「処理中にエラーは発生しませんでしたか?」という質問があります。「はい、エラーはありませんでした」と答えられます。空のリストの場合(作業なし->エラーなし)。これがstd::none_of()チェックするものです。

于 2013-03-21T18:44:50.567 に答える
2

コンテナが空の場合、独自のラッパーを作成し、それを使用して結果を変更できます。

// in your namespace, not std:
template< class InputIt, class UnaryPredicate >
bool none_of( InputIt first, InputIt last, UnaryPredicate p )
{
  return first != last && std::none_of( first, last, p );
}
于 2013-03-21T18:34:40.030 に答える