Я смог это исправить. Ключевое замечание, которое нужно сделать:
WeightMap
это просто тип интерфейса. Если оно инициализировано как в коде вопроса, поведение не определено.
Вместо этого вам нужно сохранить данные в контейнере и убедиться, что он реализует соответствующий интерфейс (то есть методы get()
, put()
и operator[]
как документация на картах свойств объясняет).
В моем случае проблему можно решить следующим образом:
Определите EdgeIndexMap
, который будет использоваться для перевода дескриптора ребра в индекс элемента вектора:
typedef property_map<Graph, edge_index_t>::type EdgeIndexMap;
И iterator_property_map
с использованием вышеупомянутого EdgeIndexMap
типа:
typedef iterator_property_map<int*, EdgeIndexMap, int, int&> IterWeightMap;
Затем можно создать экземпляр vector<IterWeightMap>
, используя данные, представленные в vector<vector<int> >
:
EdgeIndexMap eim = get(edge_index, g);
vector<vector<int> > weights(s, vector<int>(e));
vector<IterWeightMap> weightMaps(s);
for (int j=0;j<s;j++) {
weightMaps[j] = make_iterator_property_map(&(weights[j][0]), eim);
}
Обратите внимание, что свойство edge_index
(естественно) сохраняется как свойство интерьера.
Таким образом, различные свойства edge_weight
могут использоваться в вызовах алгоритма BGL как обычно, например ::101033
kruskal_minimum_spanning_tree(g, std::back_inserter(privateNetwork), weight_map(weightMaps[j]));