Как добавить карты атрибутов разных типов?

Вот проблема дизайна C ++ (11):

Предположим, я хочу создать структуру данных графа, в которой вы можете сопоставить узлы / ребра с произвольными атрибутами. (Это не очень важно, что это граф, это может быть любой контейнер для элементов с атрибутами, но это мой пример.)

С такой структурой данных я мог бы динамически добавить новый атрибут для всех узлов:

Graph G;

G.addNodeMap("color", "white"); // map name, default value

… и затем установите его для узла:

node v;
G.setAttr("color", v, "blue");

… а также удалите атрибут для экономии памяти:

G.deleteNodeMap("color");

G.addNodeMap принимает идентификатор для карты (возможно, строку) и значение по умолчанию для записей. С C ++ 11 введите T «карты узлов» может быть удобно выведен из заданного аргумента по умолчанию. Сама карта узла может быть std::vector<T> потому что узел это просто индекс.

Проблема: где я могу хранить векторы std::vector<std::string> map1, std::vector<std::double> map2, std::vector<Foo> map3….?

Эта проблема не возникает с динамически типизированными языками. Как я могу реализовать это поведение с C ++?

1

Решение

Возможно, вы захотите взглянуть на карты недвижимости Boost.Graph Library (BGL)

Основная связь между абстрактной математической природой графов и
конкретные проблемы, которые они используют для решения, это свойства, которые
прикреплены к вершинам и ребрам графа, такие вещи, как
расстояние, вместимость, вес, цвет и т. д. Есть много способов прикрепить
свойства для отображения с точки зрения реализации структуры данных, но
графические алгоритмы не должны иметь дело с реализацией
детали свойств. Интерфейс карты свойств, определенный в
Концепции карты свойств раздела предоставляют универсальный метод доступа
свойства из графиков. Это интерфейс, используемый в BGL
алгоритмы доступа к свойствам.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector