Voici une solution générique avec 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;
}
Vous remarquerez que j'ai utilisé des itérateurs bidirectionnels, ce qui signifie que la fonction ne peut fonctionner qu'avec des itérateurs qui peuvent être incrémentés et décrémentés. Une meilleure implémentation n'imposerait que le concept des Iterators d'entrée, mais pour ce problème, cela devrait être suffisant.
Puisque vous voulez l'index et non un itérateur, vous pouvez écrire une petite fonction d'aide:
template <typename BidirectionalIterator, typename T>
std::size_t getClosestIndex(BidirectionalIterator first,
BidirectionalIterator last,
const T & value)
{
return std::distance(first, getClosest(first, last, value));
}
Et maintenant, vous vous retrouvez avec un code comme ceci:
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);
}
qui donne la résultats suivants:
level | index
0.1 | 0
1.4 | 2
1.6 | 3
1.8 | 4
2.0 | 4
Nous pouvons utiliser "std :: min_element" avec un foncteur, regardez mon exemple. – Rexxar
À peu près une copie de [ce post] (http://stackoverflow.com/questions/469477/find-nearest-points-in-a-vector). – mwigdahl