2016-01-31 1 views
2

Я вижу документацию для более старой, нестандартной equal_range, которая явно вызывает строгий слабый порядок (старые документы SGI) и некоторые более новые, стандартные equal_range, которые не выполняют (cppreference, libstdC++ docs).Имеет ли std :: equal_range строгий слабый порядок?

Была ли функция изменена так, что она требовала строгого слабого упорядочения, и теперь она требует ... своего рода раздела без имени?

+2

Старые документы SGI являются документами для STL, а не для стандартной библиотеки C++. Аналогичным образом, документы Boost являются документами для Boost, а не стандартной библиотекой C++. Они не имеют никакого отношения. –

+0

Спасибо, отредактированный вопрос ... –

+0

Да, хороший хороший материал –

ответ

4

std::equal_range требует, чтобы последовательность рассматривается должна быть распределял выражения pr(value, N) и pr(N, value) где pr является предикатом, value значения, для которого вы хотите найти равный диапазон и N является элементом последовательности.

Для последовательности это более слабое условие, чем требование упорядочения последовательности со строгим слабым порядком. Для этого требуется только точка разделения P, где pr(N, value) возвращает true для всех элементов N в последовательности до P, pr(value, N) возвращает false для всех элементов в последовательности после или после P. Так, например, последовательность [2, 1, 5, 4] разбивается < и значение 3, точка разбиения быть на элементе со значением 5.

Для самого предиката, equal_range требует асимметрии по отношению к value , то есть pr(N, value) подразумевает ! pr(value, N) для всех N последовательности. В частности, это означает, что pr(X, X) может вернуть true, что не соответствует строгому упорядоченному порядку. Требования/свойства для строгого слабого упорядочении:

  • асимметрия: pr(x, y) подразумевает ! pr(y, x)
  • irreflexivity: pr(x, x) == false
  • транзитивность: pr(x, y) && pr(y, z) подразумевает pr(x, z)
  • ! pr(x, y) && ! pr(y, z) предполагает ! pr(x, z) (в элементах программирования, это заявлено через дополнительное отношение эквивалентности)

Обратите внимание, что эти точки применяются для всех элементов x, y последовательности. Однако требование по pr в equal_range не является общим требованием к предикату, а является специфическим требованием для предиката и для этого конкретного значения.

+0

@ dyp - спасибо, исправлено. –

+0

«Разделенный предикатом» может быть недостаточно точным. Как вы заявляете в своем втором абзаце, это ограничивается * значением *, которое вы передаете 'equal_range'. Например. [2, 1, 5, 4] разделено по адресу 'std :: less ' и значение 3. – dyp

+0

@ dyp. Я очень устал, и мой разум все запутался. Поэтому, пожалуйста, не стесняйтесь редактировать мой ответ, чтобы исправить это. –

 Смежные вопросы

  • Нет связанных вопросов^_^