Основной вопрос: как часто вы будете делать запросы против одного набора точек.
Если вы собираетесь найти одну ближайшую точку в наборе один раз, то @Lucian прав: вы можете также оставить точки не отсортированными и выполнить линейный поиск, чтобы найти нужную точку.
Если вы сделаете относительно большое количество запросов против одного и того же набора точек, целесообразно организовать точечные данные для повышения скорости запроса. @izomorphius уже упоминал дерево k-d, и это, безусловно, хорошее предложение. Другая возможность (по общему признанию, совершенно аналогичная) - это oct-tree. Между ними, я нахожу, что oct-tree немного легче понять. Теоретически, дерево k-d должно быть немного более эффективным (в среднем), но я никогда не видел большой разницы - хотя, возможно, с разными данными разница была бы значительной.
Однако следует отметить, что построить что-то, как к-й дерево или октаву дерево не страшно медленно, так что вам не нужно делать очень много запросов относительно набора точек, чтобы оправдать строительство одного. Один запрос явно не оправдывает его, и два, вероятно, тоже не будут, но, вопреки тому, что предполагает Лучиан, O (N log N) (например,) не очень медленный. Грубо говоря, log (N) - это число цифр в числе N, поэтому O (N log N) на самом деле не намного медленнее, чем O (N). Это, в свою очередь, означает, что вам не нужно особо большое количество запросов, чтобы оправдать организацию данных, чтобы ускорить их.
+1 для O (_n_). Я думаю, что 'std :: min_element', вероятно, является самым естественным решением. –