Поведение is_partitioned, когда ни один элемент не удовлетворяет предикату

Я был удивлен, увидев, что следующий код возвращает true:

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

string pancakes = "+++";

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

В документации, которую я вижу в Интернете, сказано is_partitioned возвращает true, если все элементы в диапазоне [first, last), которые удовлетворяют предикату, появляются перед всеми элементами, которые не соответствуют. В этом случае никакие элементы, которые удовлетворяют предикату, не появляются, поэтому я ожидал возвращаемого значения false. Это ожидаемое поведение? Где в стандарте я могу найти больше деталей?

2 ответа

Решение

Другой способ увидеть, что все элементы, которые удовлетворяют предикату, на самом деле появляются раньше тех, которые не удовлетворяют. Всего их ноль.

Еще лучше думать об этом так: что будет означать, что последовательность не будет разделена? Это означает, что вы должны сначала найти элемент, который не удовлетворяет предикату, а затем элемент, который соответствует этому. И вы не можете найти такой контрпример в вашей последовательности.

Если вы четко прочитали документацию, там написано http://en.cppreference.com/w/cpp/algorithm/is_partitioned

Возвращаемое значение true, если диапазон [first, last) пуст или разделен на p. ложь в противном случае.

Другие вопросы по тегам