Первое наблюдение состояло бы в том, что std::map
не будет самой эффективной структурой в любом случае. Ваш вклад в значительной степени исправлен, по-видимому (из комментариев). В этом случае std::binary_search
на отсортированном std::vector
является более эффективным. Основное преимущество std::map
перед отсортированным std::vector
заключается в том, что вставка - это O (log N) вместо O (N), и вам это не нужно.
Следующим наблюдением будет то, что вы можете позволить себе быть немного неточным на первом этапе. Ваш выходной набор, вероятно, будет намного меньше, чем общее количество точек (в противном случае линейный поиск будет в порядке). Но если предположить, что это так, вы можете выиграть от округления прямоугольника. Это приведет к большему количеству баллов-кандидатов, которые вы затем сверяете с точной границей.
Например, если ваши точки лежат случайным образом в плоскости XY между (0,0) и (200 300), можно было бы создать матрицу 20x30, в которой каждый будет содержать подрайон размером (10,10). Если вам теперь нужны точки в прямоугольнике от (64,23) до (78, 45), вам нужно проверить подрайоны [6,2], [6,3], [6,4], [7,2], [7,3] and [7,4]
- только 6 из 600. На втором шаге вы должны выбросить такие результаты, как ( 61, 25).