2017-04-08 4 views
0

j'été surpris de voir le retour véritable de code suivant:comportement is_partitioned quand aucun élément satisfont prédicats

bool isSadPancake(char c) { return c == '-'; } 

string pancakes = "+++"; 

bool isParitioned = is_partitioned(pancakes.begin(), pancakes.end(), isSadPancake); 

La documentation que je vois en ligne dit is_partitioned renvoie true si tous les éléments de la gamme [first, last) qui satisfont le prédicat apparaissent avant tous les éléments qui ne le font pas. Dans ce cas, aucun élément satisfaisant le prédicat n'apparaît donc je m'attendais à une valeur de retour false. Est-ce que ce comportement est attendu? Où puis-je trouver plus de détails dans la norme?

+1

Référence pertinente [ici] (http://eel.is/c++draft/alg.partitions). – DeiDei

+0

L'erreur logique dans votre pensée est que "aucun élément satisfaisant le prédicat n'apparaît" est un non-sequitur. Ce n'est pas pertinent. l'algorithme n'est pas concerné par "si les éléments qui satisfont le prédicat apparaissent". –

Répondre

4

Une autre façon de voir est que tous les éléments qui satisfont le prédicat apparaissent en fait avant ceux qui ne le font pas. Tout le zéro d'entre eux.

Une meilleure façon d'y penser est la suivante: que signifierait que la séquence ne soit pas partitionnée? Cela signifie que vous devriez être capable de trouver d'abord un élément qui ne satisfait pas le prédicat, suivi d'un qui le fait. Et vous ne pouvez pas trouver un tel contre-exemple dans votre séquence.