std :: nth_element предоставляет неправильное значение

Из заданного несортированного вектора я хочу получить n-й наименьший элемент. Я понял, что в стандартной библиотеке есть метод. Но я не понимаю следующего результата.

Я взял вектор с записями {3,4,5,2,3} и хочу получить 2-й наименьший элемент. Если я выполню следующий код, я получу число 2 во второй позиции, на самом деле это должно быть 3. Поскольку 2 является первым наименьшим элементом, а не вторым.

В чем моя ошибка?

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
std::vector<size_t> temp;
temp.assign({3,4,5,2,3});
std::nth_element (temp.begin(), temp.begin()+2, temp.end());
std::cout << std::endl;
for(size_t i=0;i<temp.size();i++){ printf("%.2f\n",(double)temp[i]);  }
}

2

Решение

temp.begin()+2 дает вам третий элемент вектора, а не второй. Первый элемент temp.begin() (Т.е. temp.begin() + 0), а второй элемент temp.begin() + 1, Итак, вы хотите сделать это:

std::nth_element (temp.begin(), temp.begin()+1, temp.end());
5

Другие решения

Если вы хотите получить второй наименьший элемент, то вы должны использовать итератор

temp.begin() + 1

или это может быть написано как

std::next( temp.begin() )

Вот демонстрационная программа

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
std::vector<size_t> v = { 3, 4, 5, 2, 3 };

std::nth_element( v.begin(), std::next( v.begin() ), v.end() );

for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
}

Выход программы

2 3 4 3 5

Как вы видите, во второй позиции находится второй наименьший элемент 3.

На мой взгляд, это не очень хороший подход, потому что он меняет порядок элементов в векторе. Обычно вы не можете изменить порядок элементов подложки контейнера.

2

По вопросам рекламы [email protected]