Поскольку он уже отсортирован, вы можете использовать equal_range
, чтобы получить пару итераторов, которые разграничивают диапазон «интересных» кортежей:
It const begin = std::lower_bound(list.begin(), list.end(),
[X](Tuple const& t) {
return t.first > -X;
});
It const end = std::upper_bound(begin, list.end(),
[X](Tuple const& t) {
return t.first < X;
});
std::pair<It,It> const range = std::make_range(begin, end);
Затем вы можете просто выполнить итерацию по этому диапазону и зарегистрировать минимальное и максимальное значения, которые вы видите:
int min = INT_MAX, max = INT_MIN;
for (Tuple const& t: range) {
if (t.second < min) { min = t.second; }
if (t.second > max) { max = t.second; }
}
// min and max are correctly set
Итак ... это не единственный алгоритм STL.
Примечание: std::min_element
и std::max_element
действительно существуют, но это будет означать повторение цикла дважды по диапазону, хотя это, безусловно, возможно.
Tuple const& min = *std::min_element(range.first, range.second,
[](Tuple const& left, Tuple const& right) {
return left.second < right.second;
});
Tuple const& max = *std::max_element(range.first, range.second,
[](Tuple const& left, Tuple const& right) {
return left.second < right.second;
});
// Or as noted by Vitali, slightly more efficient:
auto const minmax = std::minmax_element(range.first, range.second,
[](Tuple const& left, Tuple const& right) {
return left.second < right.second;
});
Tuple const& min = *minmax.first;
Tuple const& max = *minmax.second;
Обратите внимание, что он дает кортеж, а не член .second
.