Я хочу взять n-й элемент подмножества вектора, поэтому я подумал
делать что-то вроде этого:
std :: nth_element (v.begin () + start-0, v.begin () + nTh-1, v.begin () + end);
означало бы взять подмножество вектора v от начала до
конец (исключительный), а затем воображая, что это подмножество отсортировано,
Расположите элемент nTh.
Да, это правда.
Но при этом любые элементы в позициях от v [0] до v [start-1] и от v [end] до v [v.size () - 1] не будут частью перестановки nth_element, они останутся там, где они есть. Ваше начало и конец как часть nth_element () исключили возможность изменения этих элементов.
Я думаю, что вы хотите
std::nth_element (myvector.begin(), myvector.begin()+ 4, myvector.end());
который считается целым вектором (1-й и 3-й аргументы для nth_element).
Это означает, что независимо от того, где random_shuffle имеет перемешанные элементы
std::random_shuffle (myvector.begin(), myvector.end());
, поскольку nth_element учитывает весь вектор, 2-й аргумент для nth_element, 5-й элемент в myvector, если отсортирован, должен быть 5. Обратите внимание, что из-за того, как работает nth_element, предыдущие элементы будут меньше 5 (и в любом порядок), а количество следующих элементов будет больше 5 (и в любом порядке).