Boost.MultiIndex пространственные операции - PullRequest
0 голосов
/ 03 сентября 2011

Мне нужна пространственная карта для приложения.Я нашел Boost.MultiIndex.
Я следовал его учебнику и понял, как создать тип:

typedef boost::multi_index_container<MapNode,
    indexed_by<
        ordered_non_unique<member<MapNode, int, &MapNode::X>>,
        ordered_non_unique<member<MapNode, int, &MapNode::Y>>
    >
> Map_T;

И как вставить в него:

Map.insert(Node);

Как получить значение на основе его координат x и y?и как я могу проверить, есть ли там значение?

1 Ответ

0 голосов
/ 09 сентября 2011

Прежде всего, вам не нужно boost :: multi_index для решения этой проблемы.Просто перегрузите оператор <для вашего типа MapNode и используйте std :: set (соответственно std :: map, если может быть несколько узлов с одинаковыми координатами).Therby, оператор <сначала сравнивает (например) значения x.Если они равны, продолжайте сравнивать координату y. </p>

Существует только одна причина для использования boost :: multi_index: если требуются разные методы доступа.Например, если вам нужно дополнительное «представление», где узлы сначала сортируются по y, а затем по x.Однако подход multi_index для членов (как в вашем коде выше) не очень хорошая идея.Используйте идентичность дважды, но предоставьте две разные функции сравнения.Подробности можно найти в расширенном документе.

Наконец, все эти подходы могут быть не самыми лучшими - в зависимости от вашего приложения.Специализированные структуры данных описаны, например, в книге «Вычислительная геометрия» Берга и др.и др.К сожалению, я не знаю ни одной бесплатной реализации этих алгоритмов ...

...