#pragma once #include #include #include "../../core/CollectionHelper.h" #include "../../inc/tbb/parallel_for.h" template struct NearestFinder { T operator()(const T& source, const std::vector& values) const { assert(!values.empty()); float min = T::Distance(source, values[0]); size_t minIndex = 0; for (size_t i = 0; i < values.size(); i++) { float distance = T::Distance(source, values[i]); if (distance < min) { min = distance; minIndex = i; } } return values[minIndex]; } }; template struct ParallelNearestFinder { T operator()(const T& source, const std::vector& values) const { assert(!values.empty()); std::vector distances(values.size()); tbb::parallel_for(size_t(0), values.size(), [&](size_t i) { distances[i] = T::Distance(source, values[i]); }); return values[CollectionHelper::MinIndex(distances)]; } };