Issue 2163: nth_element requires inconsistent post-conditions (original) (raw)
This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++14 status.
2163. nth_element
requires inconsistent post-conditions
Section: 26.8.3 [alg.nth.element] Status: C++14 Submitter: Peter Sommerlad Opened: 2012-07-06 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [alg.nth.element].
View all issues with C++14 status.
Discussion:
The specification of nth_element refers to operator<
whereas all sorting without a compare function is based on operator<
. While it is true that for all regular types both operators should be defined accordingly, all other sorting algorithms only rely on existence of operator<
. So I guess the paragraph p1
After
nth_element
the element in the position pointed to bynth
is the element that would be in that position if the whole range were sorted. Also for any iteratori
in the range[first,nth)
and any iteratorj
in the range[nth,last)
it holds that:!(*i > *j)
orcomp(*j, *i) == false
.
should read
After
nth_element
the element in the position pointed to bynth
is the element that would be in that position if the whole range were sorted. Also for any iteratori
in the range[first,nth)
and any iteratorj
in the range[nth,last)
it holds that:!(*j < *i)
orcomp(*j, *i) == false
.
Note only "!(*i > *j)
" was changed to "!(*j < *i)
" and it would be more symmetric with comp(*j, *i)
as well.
In theory this might be a semantic change to the spec, but I believe the mistake is unintended.
[ 2012-10 Portland: Move to Ready ]
This is clearly correct by inspection, moved to Ready by unanimous consent.
[2013-04-20 Bristol]
Proposed resolution:
This wording is relative to N3376.
- Change 26.8.3 [alg.nth.element] p1 as indicated:
template
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last, Compare comp);-1- After
nth_element
the element in the position pointed to bynth
is the element that would be in that position if the whole range were sorted. Also for any iteratori
in the range[first,nth)
and any iteratorj
in the range[nth,last)
it holds that:~~!(*i > *j)~~!(*j < *i)
orcomp(*j, *i) == false
.