Если вам не нужна интерполяция, только точный обратный поиск, то это относительно просто:
std::map<YType, XType> lookup;
// (code to read the file goes here)
// for each x {
YType y = f(x);
if ((lookup.count(y) == 0) || (lookup[y] < x)) {
lookup[y] = x;
}
// }
Тогда ваш обратный поиск просто lookup[y]
, который вернет 0 (или построенный по умолчанию)значение, где это применимо) если y
фактически отсутствовало в данных.
Имейте в виду, что мой код немного неэффективен, он просматривает y
несколько раз на карте, вплоть до 3. Вы можетеоптимизировать с помощью итераторов, но меня беспокоит, что затеняет то, что происходит, если вы еще не знакомы с ними:
typedef std::map<YType, XType> maptype;
typedef std::pair<maptype::iterator, bool> resulttype;
resulttype result = lookup.insert(std::make_pair(y, x));
if (!result.second) {
// key already existed, so value was not inserted. Check for max.
maptype::iterator pos = result.first;
if ((*pos).second < x) {
(*pos).second = x;
}
}