Здесь общее решение с использованием std::lower_bound
:
template <typename BidirectionalIterator, typename T>
BidirectionalIterator getClosest(BidirectionalIterator first,
BidirectionalIterator last,
const T & value)
{
BidirectionalIterator before = std::lower_bound(first, last, value);
if (before == first) return first;
if (before == last) return --last; // iterator must be bidirectional
BidirectionalIterator after = before;
--before;
return (*after - value) < (value - *before) ? after : before;
}
Вы заметите, что я использовал двунаправленные итераторы, что означает, что функция может работать только с итераторами, которые могут быть как увеличены, так и уменьшены. Лучшая реализация только наложила бы концепцию входных итераторов, но для этой проблемы это должно быть достаточно хорошим.
Так как вы хотите, индекс и не итератора, вы можете написать небольшую вспомогательную функцию:
template <typename BidirectionalIterator, typename T>
std::size_t getClosestIndex(BidirectionalIterator first,
BidirectionalIterator last,
const T & value)
{
return std::distance(first, getClosest(first, last, value));
}
И теперь вы в конечном итоге с кодом, как это:
const int ARRAY_LENGTH = 5;
double myarray[ARRAY_LENGTH] = { 1.0, 1.2, 1.4. 1.5, 1.9 };
int getPositionOfLevel(double level)
{
return getClosestIndex(myarray, myarray + ARRAY_LENGTH, level);
}
, который дает следующие результаты:
level | index
0.1 | 0
1.4 | 2
1.6 | 3
1.8 | 4
2.0 | 4
Мы можем использовать «std :: min_element» с функтором, посмотрите на мой пример. – Rexxar
Довольно много дубликатов [этого сообщения] (http://stackoverflow.com/questions/469477/find-nearest-points-in-a-vector). – mwigdahl