Вот проблема дизайна 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 ++?
Возможно, вы захотите взглянуть на карты недвижимости Boost.Graph Library (BGL)
Основная связь между абстрактной математической природой графов и
конкретные проблемы, которые они используют для решения, это свойства, которые
прикреплены к вершинам и ребрам графа, такие вещи, как
расстояние, вместимость, вес, цвет и т. д. Есть много способов прикрепить
свойства для отображения с точки зрения реализации структуры данных, но
графические алгоритмы не должны иметь дело с реализацией
детали свойств. Интерфейс карты свойств, определенный в
Концепции карты свойств раздела предоставляют универсальный метод доступа
свойства из графиков. Это интерфейс, используемый в BGL
алгоритмы доступа к свойствам.
Других решений пока нет …