2013-12-02 1 views
8

Может кто-нибудь объяснить начинающему начинающему, как мне, что такое карта свойств в Boost? Я столкнулся с этим, пытаясь использовать BGL для расчета сильных подключенных компонентов. Я пошел бросить документацию для карты свойств и графического модуля и до сих пор не знаю, что с этим делать. Возьмите этот код, например: - что делает функция make_iterator_property_map? - и в чем смысл этого кода: get (vertex_index, G)?Что такое карта недвижимости в BOOST?

#include <boost/config.hpp> 
#include <vector> 
#include <iostream> 
#include <boost/graph/strong_components.hpp> 
#include <boost/graph/adjacency_list.hpp> 

int 
main() 
{ 
    using namespace boost; 
    typedef adjacency_list < vecS, vecS, directedS > Graph; 
    const int N = 6; 
    Graph G(N); 
    add_edge(0, 1, G); 
    add_edge(1, 1, G); 
    add_edge(1, 3, G); 
    add_edge(1, 4, G); 
    add_edge(3, 4, G); 
    add_edge(3, 0, G); 
    add_edge(4, 3, G); 
    add_edge(5, 2, G); 

    std::vector<int> c(N); 
    int num = strong_components 
    (G, make_iterator_property_map(c.begin(), get(vertex_index, G), c[0])); 

    std::cout << "Total number of components: " << num << std::endl; 
    std::vector <int>::iterator i; 
    for (i = c.begin(); i != c.end(); ++i) 
    std::cout << "Vertex " << i - c.begin() 
     << " is in component " << *i << std::endl; 
    return EXIT_SUCCESS; 
} 
+0

Я мог бы просто опубликовать всю документацию - что конкретно вы не понимаете? Это карта (поиск) для свойств. например Вы можете добавлять имена к краям или цвет к вершинам. – doctorlove

+0

+1. BGL был бы гораздо более полезен, если бы у них были приличные значения по умолчанию для карт свойств. Авторы STL поняли это, предоставив 'std :: less' в качестве стандартного порядка для' std :: map'. – MSalters

+0

@MSalters Интересно. Что вы считаете достойным дефолтом в этом конкретном примере? С большинством 'property_maps' пользователям нужно удержать их, как это должно работать здесь? – pmr

ответ

6

PropertyMaps в их основе являются абстракцией доступа к данным. Проблема, которая очень быстро возникает в общем программировании, заключается в следующем: как мне получить данные, связанные с каким-либо объектом? Он может быть сохранен в самом объекте, объект может быть указателем, он может быть вне объекта в некоторой структуре отображения.

Вы можете, конечно, инкапсулировать доступ к данным в функторе, но это очень утомительно, и вы ищете более узкое решение, выбранное в Boost - PropertyMaps.

Помните, что это только концепция. Конкретными экземплярами являются, например, std::map (с некоторой синтаксической адаптацией), функция, возвращающая член ключа (опять же, с некоторой синтаксической адаптацией).

К вашему праву: make_iterator_property_map строит iterator_property_map. Первый аргумент предоставляет итератор для основы смещения вычислений. Второй аргумент снова является свойством property_map для вычисления смещения. Вместе это дает возможность использовать vertex_descriptor для записи данных в vector на основе индекса vertex_descriptor.