Boost logo

Boost Users :

Subject: Re: [Boost-users] [BGL] Confusion about iterator_property_map and initialization of OffsetMap
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2011-04-01 14:25:54


On Fri, 1 Apr 2011, Cedric Laczny wrote:

> Hi,
>
> I have modified the astar-cities.cpp example to use an external rank_map based
> on iterator_property_map.
> The following should give you an idea:
>
> vector<cost> v_vec(num_vertices(g), 0.0);
>
> typedef property_map< mygraph_t, vertex_index_t>::type VertexIndexMap;
> VertexIndexMap v_index = get(vertex_index, g); // Initialization of interest
> // Create the external property map
> typedef iterator_property_map< std::vector< cost >::iterator, VertexIndexMap
>> CostMap;
> CostMap c_map(v_vec.begin(), v_index);
>
> and the function-call of astar_search is as follows:
>
> astar_search
> (g, start,
> distance_heuristic<mygraph_t, cost, location*, const char**>
> (locations, goal, name),
> predecessor_map(&p[0]).distance_map(&d[0]).
> visitor(a_star_vis).
> rank_map(c_map)); // Here we use the "global" cost map
>
> Basically, the code is the same as in the example, with only the addition of
> the explicit rank_map.
>
> Now I am fairly confused that the function call seems to behave the same if I
> have "get(vertex_index, g)" and if I don't have it.
> This comes unexpected to me as I would think that it needs OffsetMap (v_index)
> to correctly find the index in the random access container (v_vec). But when I
> simply declare an object it is not yet initialized and will not contain any
> meaningfull offsets (not using "get(vertex_index, g)").
> So why does it work, when the map is not initialized? Or what am I missing
> here please?

The default index map is just a typed_identity_property_map, and that
class doen't have any parameters to its constructor. However, you should
not rely on those properties, since algorithms in BGL have broken because
their authors assumed the vertex index map was the identity then users
passed in graphs (such as adjacency_list with listS as the vertex
container) with non-identity maps.

-- Jeremiah Willcock


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net