[2391] | 1 | /* -*- C++ -*- |
---|
| 2 | * |
---|
| 3 | * This file is a part of LEMON, a generic C++ optimization library |
---|
| 4 | * |
---|
[2553] | 5 | * Copyright (C) 2003-2008 |
---|
[2391] | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
---|
| 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
---|
| 8 | * |
---|
| 9 | * Permission to use, modify and distribute this software is granted |
---|
| 10 | * provided that this copyright notice appears in all copies. For |
---|
| 11 | * precise terms see the accompanying LICENSE file. |
---|
| 12 | * |
---|
| 13 | * This software is provided "AS IS" with no warranty of any kind, |
---|
| 14 | * express or implied, and with no claim as to its suitability for any |
---|
| 15 | * purpose. |
---|
| 16 | * |
---|
| 17 | */ |
---|
| 18 | |
---|
[2476] | 19 | namespace lemon { |
---|
| 20 | |
---|
[2196] | 21 | /** |
---|
| 22 | \page maps1 Maps I. |
---|
| 23 | |
---|
| 24 | In the previous section we discussed graph topology. That is the skeleton a complex |
---|
| 25 | graph represented data-set needs. But how to assign the data itself to that skeleton?<br> |
---|
| 26 | Here come the \b maps in. |
---|
| 27 | |
---|
| 28 | \section maps_intro Introduction to maps |
---|
| 29 | 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>. |
---|
| 30 | In LEMON there is many types of maps. Each map has two typedef's to determine the types of keys and values, like this: |
---|
| 31 | \code |
---|
| 32 | typedef Edge Key; |
---|
| 33 | typedef double Value; |
---|
| 34 | \endcode |
---|
| 35 | (Except matrix maps, they have two key types.) |
---|
| 36 | |
---|
| 37 | To make easy to use them - especially as template parameters - there are <i>map concepts</i> like by graph classes. |
---|
| 38 | <ul> |
---|
[2476] | 39 | <li>\ref concepts::ReadMap "ReadMap" - values can be read out with the \c operator[]. |
---|
[2196] | 40 | \code value_typed_variable = map_instance[key_value]; \endcode |
---|
| 41 | </li> |
---|
[2476] | 42 | <li>\ref concepts::WriteMap "WriteMap" - values can be set with the \c set() member function. |
---|
[2196] | 43 | \code map_instance.set(key_value, value_typed_expression); \endcode |
---|
| 44 | </li> |
---|
[2476] | 45 | <li>\ref concepts::ReadWriteMap "ReadWriteMap" - it's just a shortcut to indicate that the map is both |
---|
[2196] | 46 | readable and writable. It is delivered from them. |
---|
| 47 | </li> |
---|
[2476] | 48 | <li>\ref concepts::ReferenceMap "ReferenceMap" - a subclass of ReadWriteMap. It has two additional typedefs |
---|
[2196] | 49 | <i>Reference</i> and <i>ConstReference</i> and two overloads of \c operator[] to |
---|
| 50 | providing you constant or non-constant reference to the value belonging to a key, |
---|
| 51 | so you have a direct access to the memory address where it is stored. |
---|
| 52 | </li> |
---|
| 53 | <li>And there are the Matrix version of these maps, where the values are assigned to a pair of keys. |
---|
[2476] | 54 | The keys can be different types. (\ref concepts::ReadMatrixMap "ReadMatrixMap", |
---|
| 55 | \ref concepts::WriteMatrixMap "WriteMatrixMap", \ref concepts::ReadWriteMatrixMap "ReadWriteMatrixMap", |
---|
| 56 | \ref concepts::ReferenceMatrixMap "ReferenceMatrixMap") |
---|
[2196] | 57 | </li> |
---|
| 58 | </ul> |
---|
| 59 | |
---|
| 60 | \section maps_graph Graphs' maps |
---|
| 61 | Every \ref MappableGraphComponent "mappable" graph class has two public templates: NodeMap<VALUE> and EdgeMap<VALUE> |
---|
| 62 | satisfying the \ref GraphMap concept. |
---|
| 63 | If you want to assign data to nodes, just declare a NodeMap with the corresponding |
---|
| 64 | type. As an example, think of a edge-weighted directed graph. |
---|
| 65 | \code ListGraph::EdgeMap<int> weight(graph); \endcode |
---|
[2408] | 66 | You can see that the map needs the graph whose edges will mapped, but nothing more. |
---|
[2196] | 67 | |
---|
| 68 | If the graph class is extendable or erasable the map will automatically follow |
---|
| 69 | the changes you make. If a new node is added a default value is mapped to it. |
---|
| 70 | You can define the default value by passing a second argument to the map's constructor. |
---|
| 71 | \code ListGraph::EdgeMap<int> weight(graph, 13); \endcode |
---|
| 72 | But keep in mind that \c VALUE has to have copy constructor. |
---|
| 73 | |
---|
| 74 | Of course \c VALUE can be a rather complex type. |
---|
| 75 | |
---|
| 76 | For practice let's see the following template function (from \ref maps_summary "maps-summary.cc" in the \ref demo directory)! |
---|
| 77 | \dontinclude maps_summary.cc |
---|
| 78 | \skip template |
---|
| 79 | \until } |
---|
| 80 | The task is simple. We need the summary of some kind of data assigned to a graph's nodes. |
---|
| 81 | (Whit a little trick the summary can be calculated only to a sub-graph without changing |
---|
| 82 | this code. See \ref SubGraph techniques - that's LEMON's true potential.) |
---|
| 83 | |
---|
| 84 | And the usage is simpler than the declaration suggests. The compiler deduces the |
---|
| 85 | template specialization, so the usage is like a simple function call. |
---|
| 86 | \skip std |
---|
| 87 | \until ; |
---|
| 88 | |
---|
| 89 | 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. |
---|
| 90 | |
---|
| 91 | If you want some 'real-life' examples see the next page, where we discuss \ref algorithms |
---|
| 92 | (coming soon) and will use maps hardly. |
---|
| 93 | Or if you want to know more about maps read these \ref maps2 "advanced map techniques". |
---|
| 94 | */ |
---|
[2476] | 95 | |
---|
| 96 | } |
---|