|
1 /** |
|
2 \page maps1 Maps I. |
|
3 |
|
4 In the previous section we discussed graph topology. That is the skeleton a complex |
|
5 graph represented data-set needs. But how to assign the data itself to that skeleton?<br> |
|
6 Here come the \b maps in. |
|
7 |
|
8 \section maps_intro Introduction to maps |
|
9 Maps play a central role in LEMON. As their name suggests, they map a certain range of <i>keys</i> to certain <i>values</i>. |
|
10 In LEMON there is many types of maps. Each map has two typedef's to determine the types of keys and values, like this: |
|
11 \code |
|
12 typedef Edge Key; |
|
13 typedef double Value; |
|
14 \endcode |
|
15 (Except matrix maps, they have two key types.) |
|
16 |
|
17 To make easy to use them - especially as template parameters - there are <i>map concepts</i> like by graph classes. |
|
18 <ul> |
|
19 <li>\ref ReadMap - values can be red out with the \c operator[]. |
|
20 \code value_typed_variable = map_instance[key_value]; \endcode |
|
21 </li> |
|
22 <li>\ref WriteMap - values can be set with the \c set() member function. |
|
23 \code map_instance.set(key_value, value_typed_expression); \endcode |
|
24 </li> |
|
25 <li>\ref ReadWriteMap - it's just a shortcut to indicate that the map is both |
|
26 readable and writable. It is delivered from them. |
|
27 </li> |
|
28 <li>\ref ReferenceMap - a subclass of ReadWriteMap. It has two additional typedefs |
|
29 <i>Reference</i> and <i>ConstReference</i> and two overloads of \c operator[] to |
|
30 providing you constant or non-constant reference to the value belonging to a key, |
|
31 so you have a direct access to the memory address where it is stored. |
|
32 </li> |
|
33 <li>And there are the Matrix version of these maps, where the values are assigned to a pair of keys. |
|
34 The keys can be different types. (\ref ReadMatrixMap, \ref WriteMatrixMap, \ref ReadWriteMatrixMap, \ref ReferenceMatrixMap) |
|
35 </li> |
|
36 </ul> |
|
37 |
|
38 \section maps_graph Graphs' maps |
|
39 Every \ref MappableGraphComponent "mappable" graph class has two public templates: NodeMap<VALUE> and EdgeMap<VALUE> |
|
40 satisfying the \ref GraphMap concept. |
|
41 If you want to assign data to nodes, just declare a NodeMap with the corresponding |
|
42 type. As an example, think of a edge-weighted directed graph. |
|
43 \code ListGraph::EdgeMap<int> weight(graph); \endcode |
|
44 You can see that the map needs the graph hows edges will mapped, but nothing more. |
|
45 |
|
46 If the graph class is extendable or erasable the map will automatically follow |
|
47 the changes you make. If a new node is added a default value is mapped to it. |
|
48 You can define the default value by passing a second argument to the map's constructor. |
|
49 \code ListGraph::EdgeMap<int> weight(graph, 13); \endcode |
|
50 But keep in mind that \c VALUE has to have copy constructor. |
|
51 |
|
52 Of course \c VALUE can be a rather complex type. |
|
53 |
|
54 For practice let's see the following template function (from \ref maps_summary "maps-summary.cc" in the \ref demo directory)! |
|
55 \dontinclude maps_summary.cc |
|
56 \skip template |
|
57 \until } |
|
58 The task is simple. We need the summary of some kind of data assigned to a graph's nodes. |
|
59 (Whit a little trick the summary can be calculated only to a sub-graph without changing |
|
60 this code. See \ref SubGraph techniques - that's LEMON's true potential.) |
|
61 |
|
62 And the usage is simpler than the declaration suggests. The compiler deduces the |
|
63 template specialization, so the usage is like a simple function call. |
|
64 \skip std |
|
65 \until ; |
|
66 |
|
67 Most of the time you will probably use graph maps, but keep in mind, that in LEMON maps are more general and can be used widely. |
|
68 |
|
69 If you want some 'real-life' examples see the next page, where we discuss \ref algorithms |
|
70 (coming soon) and will use maps hardly. |
|
71 Or if you want to know more about maps read these \ref maps2 "advanced map techniques". |
|
72 */ |