Поведение 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. ложь в противном случае.