Другой вариант - указать пользовательское сравнение для std::nth_element
, которое фиксирует минимальное и максимальное значения.Скорее всего, в конечном итоге будет выполняться гораздо больше сравнений и ветвлений, поэтому на некоторых конкретных аппаратных средствах это может быть медленнее, возможно, в зависимости от того, какая часть ваших данных кэшируется и т. Д., И, как всегда, для сравнения, если у вас есть причина для этогоно для непустого vector
a
метод выглядит следующим образом:
int min = a[0], max = a[0];
std::nth_element(a.begin(), a.begin() + n, a.end(),
[&](int lhs, int rhs) {
min = std::min(min, std::min(lhs, rhs));
max = std::max(max, std::max(lhs, rhs));
return lhs < rhs;
});
Сколько бы это ни стоило, на моем (~ 10yo i5-660) HTPC с использованием GCC 7.4 с 1 миллионом случайныхint
с от 0 до 1000, nth_element
занимает примерно на 36% больше времени при сравнении мин / макс, чем без.