Basics.tex
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:27k
开发平台:

MultiPlatform

  1. chapter{Basics}
  2. label{Basics}
  3. section{A First Example}
  4. label{A First Example}
  5. The following program can be compiled and linked 
  6. with LEDA's basic library $libL.a$ (cf. section ref{Libraries}).
  7. When executed it reads a sequence of strings from the standard input and then 
  8. prints the number of occurrences of each string on the standard output. More 
  9. examples of LEDA programs can be found throughout this manual.
  10. #include <LEDA/d_array.h>\
  11. main()\
  12. {
  13.    d_array<string,int> $N(0)$;\
  14. smallskip
  15.    string $s$;\
  16. smallskip
  17.    {bf while} (cin >> $s$ ) $N[s]${tt ++};\
  18. smallskip
  19.    {bf forall_defined}($s,N$) 
  20.                 cout << $s$ << " " << $N[s]$ << $endl$;\
  21. smallskip
  22. $}$\
  23. The program above uses the parameterized data type dictionary array 
  24. ($d_array<I,E>$) from the library. This is expressed by the include 
  25. statement (cf. section ref{Header Files} for more details). The specification 
  26. of the 
  27. data type $d_array$ can be found in section ref{Dictionary Arrays}.
  28. We use it also as a 
  29. running example to discuss the principles underlying LEDA in sections 
  30. ref{Specifications}
  31. to ref{Libraries}.
  32. Parameterized data types in LEDA are realized by templates,
  33. inheritance and dynamic binding. 
  34. For CC compilers not supporting templates there is still available a 
  35. non-template version of LEDA using declare macros as described in cite{N90}.
  36. section{Specifications}
  37. label{Specifications}
  38. In general the specification of a LEDA data type consists of four parts:
  39. a definition of the set of objects comprising the (parameterized) abstract
  40. data type, a description of how to create an object of the data type,
  41. the definition of the operations available on the objects of the data 
  42. type, and finally, information about the implementation. The four parts 
  43. appear under the headers definition, creation, operations, and implementation 
  44. respectively.
  45. Sometimes there is also a fifth part showing an example.
  46. begin{itemize}
  47. item{bf Definition}
  48. smallskip
  49. This part of the specification defines the objects (also called instances or
  50. elements) comprising the data type using standard mathematical concepts and 
  51. notation. 
  52. {bf Example}
  53. The generic data type dictionary array:
  54. An object $a$ of type $d_array<I,E>$ is an injective function from the
  55. data type $I$ to the set of variables of data type $E$. The types $I$ and
  56. $E$ are called the index and the element type respectively, $a$ is called
  57. a dictionary array from $I$ to $E$.
  58. Note that the types $I$ and $E$ are parameters in the definition above.
  59. Any built-in, pointer, item, or user-defined class type $T$ can be used 
  60. as actual type parameter of a parameterized data type. Class types however 
  61. have to provide the following operations:
  62. [
  63. begin{array}{ll}
  64. mbox{a) a constructor taking no arguments} &mbox{ T::T()} \
  65. mbox{b) a copy constructor}     &mbox{T::T(const T&)} \
  66. mbox{c) an assignment operator} &mbox{T& T::operator=(const T&)} \
  67. \
  68. mbox{and if required by the parameterized data type}\
  69. mbox{d) an input function}  &mbox{void  {bf Read}(T&, istream&)}\
  70. mbox{e) an output function} &mbox{void  {bf Print}(const T&, ostream&)}\
  71. mbox{f) a compare function} &mbox{int  {bf compare}(const T&, const T&)}\
  72. mbox{g) a hash function}    &mbox{int  {bf Hash}(const T&)}\
  73. end{array}
  74. ]
  75. For details see sections ref{Linear Orders} and ref{Hashed Types}.
  76. item {bf Creation}
  77. smallskip
  78. A variable of a data type is introduced by a CC variable declaration. 
  79. For all LEDA data types variables are initialized at the time of declaration. 
  80. In many cases the user has to provide arguments used for the initialization 
  81. of the variable.  In general a declaration
  82. $XYZ<t_1,dots,t_k>$    $y(x_1,dots,x_ell)$;
  83. introduces a variable $y$ of the data type ``$XYZ<t_1,dots,t_k>$''
  84. and uses the arguments $x_1,dots,x_ell$ to initialize it. For example,
  85. $d_array<string,int>$ $A(0)$
  86. introduces $A$ as a dictionary array from strings to integers, and 
  87. initializes $A$ as follows: an injective function $a$ from $string$
  88. to the set of unused variables of type $int$ is constructed, and is
  89. assigned to $A$. Moreover, all variables in the range of $a$ are 
  90. initialized to 0.
  91. The reader may wonder how LEDA handles an array of infinite size. The
  92. solution is, of course, that only that part of $A$ is explicitly stored
  93. which has been accessed already.
  94. For all data types, the assignment operator ($=$) is available for variables 
  95. of that type. Note however that assignment is in general not a constant time 
  96. operation, e.g., if $L_1$ and $L_2$ are variables of type $list<T>$ then the 
  97. assignment $L_1 = L_2$ takes time proportional to the length of the list $L_2$
  98. times the time required for copying an object of type $T$.
  99. {bf Remark}: For most of the complex data types of LEDA, e.g., dictionaries,
  100. lists, and priority queues, it is convenient to interpret a variable name
  101. as the name for an object of the data type which evolves over time by means
  102. of the operations applied to it. This is appropriate, whenever the operations 
  103. on a data type only ``modify'' the values of variables, e.g., it is more 
  104. natural to say an operation on a dictionary $D$ modifies $D$ than to say that 
  105. it takes the old value of $D$, constructs a new dictionary out of it, and 
  106. assigns the new value to $D$. Of course, both interpretations are equivalent.
  107. From this more object-oriented point of view, a variable declaration, e.g.,
  108. $dictionary<string,int>$ $D$, is creating a new dictionary object with 
  109. name $D$ rather than introducing a new variable of type 
  110. $dictionary<string,int>$; hence the name ``creation'' for this part of 
  111. a specification.
  112.  
  113. item{bf Operations}
  114. smallskip
  115. In this section the operations of the data types are described. For each 
  116. operation the description consists of two parts
  117. begin{enumerate}
  118. item 
  119. The interface of the operation is defined using the CC function declaration
  120. syntax. In this syntax the result type of the operation ($void$ if there is 
  121. no result) is followed by the operation name and an argument list specifying 
  122. the type of each argument. For example,
  123. smallskip
  124. $list_item$ $L$.insert ($E x, list_item it, int dir=after$)\
  125. defines the interface of the insert operation on a list $L$ of elements of type
  126. $E$ (cf. section ref{Linear Lists}). Insert takes as arguments an element $x$ 
  127. of type $E$, 
  128. a $list_item$ $it$ and an optional relative position argument $dir$. It returns 
  129. a $list_item$ as result.  
  130. smallskip
  131. $E&$  $A[I x]$\
  132. defines the interface of the access operation on a dictionary array $A$. It 
  133. takes an element $x$ of type $I$ as an argument and returns a variable of type $E$.
  134. item  
  135. {The effect of the operation is defined.  Often the arguments have to 
  136. fulfill certain preconditions. If such a condition is violated the effect 
  137. of the operation is undefined. Some, but not all, of these cases result 
  138. in error messages and abnormal termination of the program (see also 
  139. section ref{Error Handling}). For the insert operation on lists this 
  140. definition reads:\
  141. A new item with contents $x$ is inserted after (if $dir=after$) or before 
  142. (if $dir=before$) item $it$ into $L$. The new item is returned.
  143. {it Precondition}: item $it$ must be in $L$.}
  144. {For the access operation on dictionary arrays the definition reads:\
  145. returns the variable $A(x)$.
  146. }
  147. end{enumerate}
  148. item {bf  Implementation}
  149. smallskip
  150. The implementation section lists the (default) data structures used to 
  151. implement the data type and gives the time bounds for the operations and 
  152. the space requirement. For example,
  153. Dictionary arrays are implemented by randomized search trees (cite{AS89}). 
  154. Access operations $A[x]$ take time $O(log dom(A))$.
  155. The space requirement is $O(dom(A))$.
  156. end{itemize}
  157. section{Implementation Parameters}
  158.    
  159. label{Implementation Parameters}
  160. For many of the parameterized data types (in the current version: dictionary, 
  161. priority queue, d_array, and sortseq) there exist variants taking an additional
  162. data structure parameter for choosing a particular implementation 
  163. (cf. chapter ref{Dictionaries with Implementation Parameter},
  164. ref{Sorted Sequences with Implementation Parameter},
  165. ref{Dictionary Arrays with Implementation Parameter}
  166. and ref{Priority Queues with Implementation Parameter}). Since CC
  167. does not
  168. allow to overload templates we had 
  169. to use different names: the variants with an additional implementation 
  170. parameters start with an underscore, e.g., _d_array<I,E,impl>. 
  171. We can easily modify the example program from section ref{A First Example} 
  172. to use a dictionary 
  173. array implemented by a particular data structure, e.g., skip lists (cite{Pu90}), 
  174. instead of the default data structure (cf. section ref{List of data structures}). 
  175. medskip
  176. #include <LEDA/d_array.h>\
  177. #include <LEDA/impl/skiplist.h>\
  178. smallskip
  179. main()\
  180. ${$
  181.    _d_array<string,int,skiplist> $N(0)$;\
  182. smallskip
  183.    string $s$;\
  184. smallskip
  185.    {bf while} (cin >> $s$) $N[s]${tt ++};\
  186. smallskip
  187.    {bf forall_defined}($s,N$) 
  188.                 cout << $s$ << " " << $N[s]$ << $endl$;\
  189. smallskip
  190. $}$\
  191. Any type _XYZ<$T_1,dots,T_k,xyz_impl$> is derived from the corresponding
  192. ``normal" parameterized type XYZ<$T_1,dots,T_k$>, i.e., an instance of type 
  193. _XYZ<$T_1,dots,T_k,xyz_impl$> can be passed as argument to functions with
  194. a formal parameter of type XYZ<$T_1,dots,T_k$>&. 
  195. This provides a mechanism
  196. for choosing implementations of data types in pre-compiled algorithms.
  197. See ``prog/graph/dijkstra.c" for an example.
  198. LEDA offers several implementations for each of the data types. For
  199. instance, skip lists, randomized search trees, and red-black trees
  200. for dictionary arrays. Users can also provide their own implementation. 
  201. A data structure ``xyz_impl" can be used as actual
  202. implementation parameter for a data type $_XYZ$ if it provides a 
  203. certain set of operations and uses certain virtual functions for type 
  204. dependent operations (e.g. compare, initialize, copy, dots).
  205. Chapter ref{Implementations} lists all data structures contained in the current version and 
  206. gives the exact requirements for implementations of 
  207. dictionaries, priority_queues, sorted sequences and dictionary arrays.
  208. A detailed description of the mechanism for parameterized data types and 
  209. implementation parameters used in LEDA will be published soon.
  210. section{Arguments}
  211. label{Arguments}
  212. begin{itemize}
  213. item{bf Optional Arguments}
  214. smallskip
  215. The trailing arguments in the argument list of an operation may be optional.
  216. If these trailing arguments are missing in a call of an operation the default 
  217. argument values given in the specification are used. For
  218. example, if the relative position argument in the list insert operation
  219. is missing it is assumed to have the value $after$, i.e.,
  220. $L$.insert($it,y$) will insert the item <$y$> after item $it$ into $L$.
  221. item{bf Argument Passing}
  222. smallskip
  223. There are two kinds of argument passing in CC, by value and by reference.
  224. An argument $x$  of type $type$  specified by ``$type x$'' in the argument 
  225. list of an operation or user defined function will be passed by value, i.e.,
  226. the operation or function is provided with a copy of $x$.
  227. The syntax for specifying an argument passed by reference is ``$type& x$''.
  228. In this case the operation or function works directly on $x$ ( the variable
  229. $x$ is passed not its value).
  230. Passing by reference must always be used if the operation is to change the
  231. value of the argument. It should always be used for passing large objects
  232. such as lists, arrays, graphs and other LEDA data types to functions.
  233. Otherwise a complete copy of the actual argument is made, which takes time
  234. proportional to its size, whereas  passing by reference always takes constant
  235. time. 
  236. item{bf Functions as Arguments}
  237. smallskip
  238. Some operations take functions as arguments. For instance the bucket sort 
  239. operation on lists requires a function which maps the elements of the list into
  240. an interval of integers. We use the CC syntax to define the type of a function
  241. argument $f$:
  242. $$T  (*f)(T_1, T_2,dots, T_k)$$ declares $f$ to be a function 
  243. taking $k$ arguments of the data types $T_1$, dots, $T_k$,
  244. respectively, and returning a result of type $T$, i.e,
  245. $f: T_1 times dots times T_k longrightarrow T$ .
  246. end{itemize}
  247. section{Overloading}
  248. label{Overloading}
  249. Operation and function names may be overloaded, i.e., there can be different 
  250. interfaces for the same operation. An example is the translate operations
  251. for points (cf. section ref{Basic Data Types for Two-Dimensional Geometry}).
  252. smallskip
  253. $point$  $p$.translate($vector v$)\
  254. $point$  $p$.translate($double alpha, double dist$)
  255. It can either be called with a vector as argument or with two arguments
  256. of type $double$ specifying the direction and the distance of the translation.
  257. An important overloaded function is discussed in the next section: Function 
  258. $compare$, used to define linear orders for data types.
  259. section{Linear Orders} label{Linear Orders}
  260. Many data types, such as dictionaries, priority queues, and sorted sequences
  261. require linearly ordered parameter types. Whenever a type $T$ is used in such a
  262. situation, e.g. in $dictionary<T,dots>$ the function
  263. $$int  compare(const T&, const T&)$$ 
  264. must be declared and must define a linear order on the data type $T$.
  265. A binary relation $rel$ on a set $T$ is called a linear order on $T$ if for
  266. all $x,y,zin T$:
  267. smallskip
  268. 1) $x$ $rel$ $x$\
  269. 2) $x$ $rel$ $y$ and $y$ $rel$ $z$ implies $x$ $rel$ $z$\
  270. 3) $x$ $rel$ $y$ or  $y$ $rel$ $x$\
  271. 4) $x$ $rel$ $y$ and $y$ $rel$ $x$ implies $x = y$
  272. medskip
  273. A function $int$ $compare(const T&, const T&)$ defines the linear order 
  274. $rel$ on $T$ if
  275. $$compare(x,y)  cases{ < 0, &if $x$ $rel$ $y$  and  $xne y$cr 
  276.                        = 0, &if $x = y$cr 
  277.                        > 0, &if $y$ $rel$ $x$  and  $xne y$cr} $$
  278. For each of the simple data types $char$, $short$, $int$, $long$, $float$, 
  279. $double$, $string$, and $point$ a function $compare$ is predefined and defines 
  280. the so-called default ordering on that type. The default ordering is the 
  281. usual $le$ - order for the built-in numerical types, the lexicographic 
  282. ordering for $string$, and for $point$ the lexicographic ordering of the 
  283. cartesian coordinates.  For all other types $T$ there is no default 
  284. ordering, and the user has to provide a $compare$ function whenever a linear 
  285. order on $T$ is required.
  286. {bf Example}: Suppose pairs of real numbers shall be used as keys 
  287. in a dictionary with the lexicographic order of their components.
  288. First we declare class $pair$ as the type of pairs of real numbers, 
  289. then we define the I/O operations $Read$ and $Print$ and the 
  290. lexicographic order on $pair$ by writing an appropriate $compare$ function.
  291. bigskip
  292. {bf class} $pair$ ${$
  293.    $double  x$;
  294.    $double  y$;
  295. {bf public:}
  296.    $pair() { x = y = 0; }$
  297.    $pair($const $pair& p) { x = p.x; y = p.y; }$
  298. smallskip
  299.    friend $void$ Read($pair$& $p$, $istream$& $is$)
  300.       ${$ $is$ >> $p.x$ >> $p.y$; $}$
  301.    friend $void$ Print(const $pair$& $p$, $ostream$& $os$) 
  302.       ${$ $os$ << $p.x$ << `` " << $p.y$; $}$
  303.    friend $int$ compare(const $pair$&, const $pair$&);\
  304. $}$;\
  305. \
  306. $int$ compare(const $pair& p$, const $pair& q$)\
  307. ${$\
  308. smallskip
  309.    {bf if} ($p.x$ < $q.x$) {bf return } -1;\
  310. smallskip
  311.    {bf if} ($p.x$ > $q.x$) {bf return }  1;\ 
  312. smallskip
  313.    {bf if} ($p.y$ < $q.y$) {bf return } -1;\
  314. smallskip
  315.    {bf if} ($p.y$ > $q.y$) {bf return }  1;\
  316. smallskip
  317.    {bf return} 0; \
  318. $}$
  319. smallskip
  320. Now we can use dictionaries with key type $pair$, e.g.,
  321. dictionary<$pair$,$int$> D;
  322. bigskip
  323. Sometimes, a user may need additional linear orders on a data type $T$ 
  324. which are different from the order defined by $compare$, e.g., he might 
  325. want to order points in the plane by the lexicographic ordering of their 
  326. cartesian coordinates and by their polar coordinates. In this example, the 
  327. former ordering is the default ordering for points. The user can introduce 
  328. an alternative ordering on the data type $point$ (cf. section 
  329. ref{Basic Data Types for Two-Dimensional Geometry}) by defining
  330. an appropriate comparing function $int$ $cmp$(const $point$&, const $point$&)
  331. and then calling the macro 
  332. begin{center}
  333. DEFINE_LINEAR_ORDER($point$, $cmp$, $point_1$). 
  334. end{center}
  335. smallskip
  336. After this call $point_1$ is a new data type which is equivalent to the data 
  337. type $point$, with the only exception that if $point_1$ is used as an actual 
  338. parameter e.g. in $dictionary<point_1,dots>$, the resulting data type 
  339. is based on the linear order defined by $cmp$.
  340. In general the macro call
  341. begin{center}
  342. DEFINE_LINEAR_ORDER($T$, $cmp$, $T_1$)  
  343. end{center}
  344. introduces a new type $T_1$ equivalent to type $T$ with the linear order
  345. defined by the compare function $cmp$.
  346. In the example, we first declare a function $pol_cmp$ and derive a new type
  347. $pol_point$ using the DEFINE_LINEAR_ORDER macro.\
  348. smallskip
  349. $int$  $pol_cmp$(const $point$& $x$, const $point$& $y$)\
  350. ${$  co lexicographic ordering on polar coordinates  $}$\
  351. \
  352. DEFINE_LINEAR_ORDER($point$,$pol_cmp$,$pol_point$)\
  353. Now, dictionaries based on either ordering can be used.
  354. smallskip
  355. $dictionary<pol_point,int>$ $D_1$;  co polar ordering\
  356. smallskip
  357. $dictionary<point,int>$ $D_0$;      co default ordering\
  358. {bf Remark}: We have chosen to associate a fixed linear order with most of
  359. the simple types (by predefining the function $compare$). This order is used
  360. whenever operations require a linear order on the type, e.g., the operations
  361. on a dictionary. Alternatively, we could have required the user to specify a
  362. linear order each time he uses a simple type in a situation where an ordering
  363. is needed, e.g., a user could define
  364. quadquadquad $dictionary<point,lexicographic_ordering,dots>$
  365. This alternative would handle the cases where two or more different orderings
  366. are needed more elegantly. However, we have chosen the first alternative
  367. because of the smaller implementation effort.
  368. section{Hashed Types} label{Hashed Types}
  369. LEDA also contains parameterized data types requiring a hash function
  370. for the actual type parameters. Examples are dictionaries implemented 
  371. by hashing with chaining ($_dictionary<K,I,ch_hashing>$)
  372. or hashing arrays ($h_array<I,E>$).  Whenever a type $T$ is used in such
  373. a context, e.g., in $h_array<T,dots>$ a function 
  374. $$int  Hash(const T&)$$
  375. has to be defined that maps the elements of type $T$ to integers. It is not
  376. required that $Hash$ is a perfect hash function, i.e., it has not to be
  377. injective. However, the performance of the underlying implementations
  378. very strongly depends on the ability of the function to keep different
  379. elements of $T$ apart by assigning them different integers.
  380. Typically, a search operation in a hashing implementation takes time
  381. linear in the maximal size of any subset whose elements are assigned the
  382. same hash value.
  383. For each of the simple numerical data types char, short, int, long
  384. there is a predefined $Hash$ function: the identity function.
  385. We demonstrate the use of $Hash$ and a data type based on hashing
  386. by extending the example from the previous section. Suppose we
  387. want to associate information with values of the $pair$ class
  388. by using a hashing array $h_array<pair,int> A$. We first
  389. define a hash function that assigns each pair $(x,y)$
  390. the integral part of the first component $x$
  391. $int   Hash(const pair& p$) ${$ return $int(p.x)$; $}$\
  392. and then can use a hashing array with index type $pair$\
  393. $h_array<pair,int> A$;
  394. section{Items }
  395. label{Items}
  396. Many of the advanced data types in LEDA (dictionaries, priority queues, 
  397. graphs, dots), are defined in terms of so-called items. 
  398. An item is a container which can hold an object
  399. relevant for the data type. For example, in the case of dictionaries a
  400. $dic_item$ contains a pair consisting of a key and an information.
  401. A general definition of items will be given at the end of this section. 
  402. We now discuss the role of items for the dictionary example in some detail. 
  403. A popular specification of dictionaries defines a dictionary as a partial
  404. function from some type $K$ to some other type $I$, or alternatively, as a
  405. set of pairs from $Ktimes I$, i.e., as the graph of the function. In an
  406. implementation each pair $(k,i)$ in the dictionary is stored in some location
  407. of the memory. Efficiency dictates that the pair $(k,i)$ cannot only be
  408. accessed through the key $k$ but sometimes also through the location where it
  409. is stored, e.g., we might want to lookup the information $i$ associated with
  410. key $k$ (this involves a search in the data structure), then compute with the
  411. value $i$ a new value $i'$, and finally associate the new value with $k$.
  412. This either involves another search in the data structure or, if the lookup
  413. returned the location where the pair $(k,i)$ is stored, can be done by direct
  414. access. Of course, the second solution is more efficient and we therefore
  415. wanted to provide it in LEDA.
  416. In LEDA items play the role of positions or locations in data structures. Thus
  417. an object of type $dictionary<K,I>$, where $K$ and $I$ are types, is 
  418. defined as a collection of items (type $dic_item$) where each item contains 
  419. a pair in $Ktimes I$. We use <$k,i$> to denote an item with key $k$ and 
  420. information $i$ and require that for each $kin K$ there is at most one 
  421. $iin I$ such that <$k,i$> is in the dictionary. In mathematical terms this
  422. definition may be rephrased as follows: A dictionary $d$ is a partial
  423. function from the set $dic_item$ to the set $Ktimes I$. Moreover, for each
  424. $kin K$ there is at most one $iin I$ such that the pair $(k,i)$ is in $d$.
  425. The functionality of the operations 
  426. smallskip
  427. begin{tabular}{ll}
  428. $dic_item$  &$D$.lookup($K k$)\
  429. \
  430. $I$ &$D$.inf($dic_item it$)\
  431. \
  432. $void$ &$D$.change_inf($dic_item it, I i'$)
  433. end{tabular}
  434. smallskip
  435. is now as follows:
  436. $D$.lookup($k$) returns an item $it$ with contents $(k,i)$, $D$.inf($it$) 
  437. extracts $i$ from $it$, and a new value $i'$ can be associated with $k$ by
  438. $D$.change_inf($it,i'$).
  439. Let us have a look at the insert operation for dictionaries next:
  440. smallskip
  441. $dic_item$ $D$.insert($K k, I i$)
  442. There are two cases to consider. If $D$ contains an item $it$ with contents
  443. $(k,i')$ then $i'$ is replaced by $i$ and $it$ is returned. If $D$ contains
  444. no such item, then a new item, i.e., an item which is not contained in any 
  445. dictionary, is added to $D$, this item is made to contain $(k,i)$ and is
  446. returned. In this manual (cf. section ref{Dictionaries}) all of this 
  447. is abbreviated to\
  448. parbox{2cm}{$dic_item$}
  449. parbox{4cm}{$D$.insert($K k,  I i$)} 
  450. parbox[t]{9cm}{associates the information $i$ with the key $k$.
  451.              If there is an item <$k,j$> in $D$ then $j$ is
  452.              replaced by i, else a new item <$k,i$> is added
  453.              to $D$. In both cases the item is returned.}\
  454. We now turn to a general discussion. With some LEDA types $XYZ$ there is an
  455. associated type $XYZ_item$ of items. Nothing is known about the objects of
  456. type $XYZ_item$ except that there are infinitely many of them. The only
  457. operations available on $XYZ_items$ besides the one defined in the
  458. specification of type $XYZ$ is the equality predicate ``=='' and the assignment
  459. operator ``='' . The objects of type $XYZ$ are defined as sets or sequences of
  460. $XYZ_items$ containing objects of some other type $Z$. In this situation an
  461. $XYZ_item$ containing an object $zin Z$ is denoted by <$z$>. A new or unused
  462. $XYZ_item$ is any $XYZ_item$ which is not part of any object of type $XYZ$.
  463. {bf Remark}: For some readers it may be useful to interpret a $dic_item$ as
  464. a pointer to a variable of type $Ktimes I$. The differences are that the
  465. assignment to the variable contained in a $dic_item$ is restricted, e.g., the
  466. $K$-component cannot be changed, and that in return for this restriction the
  467. access to $dic_items$ is more flexible than for ordinary variables, e.g.,
  468. access through the value of the $K$-component is possible.
  469. section{Iteration}
  470. label{Iteration}
  471. For many data types LEDA provides iteration macros. These macros can be
  472. used to iterate over the elements of lists, sets and dictionaries or
  473. the nodes and edges of a graph. Iteration macros can be used similarly to 
  474. the CC {bf for} statement with the restriction that inside the
  475. body of a loop the corresponding  object must not be altered. 
  476. For instance, it is not allowed to delete nodes from a graph $G$
  477. inside the body of a {bf forall_nodes} loop.
  478. Examples are
  479. for all item based data types:
  480. smallskip
  481. {bf forall_items}($it,D$) 
  482. ${$ the items of $D$ are successively assigned to variable $it }$
  483. smallskip
  484. for lists and sets:
  485. smallskip
  486. {bf forall}($x,L$) ${$ the elements of $L$ are successively assigned to $x }$
  487. smallskip
  488. for graphs:
  489. smallskip
  490. {bf forall_nodes}($v,G$) ${$ the nodes of $G$ are successively
  491. assigned to $v }$
  492. smallskip
  493. {bf forall_edges}($e,G$) ${$ the edges of $G$ are successively
  494. assigned to $e }$
  495. smallskip
  496. {bf forall_adj_edges}($e,v$) ${$ all edges adjacent to $v$ are
  497. successively assigned to $e }$
  498. section{Header Files}
  499. label{Header Files}
  500. LEDA data types and algorithms can be used in any CC program as described 
  501. in this manual. The specifications (class declarations) are contained
  502. in header files. To use a specific data type its header file has to be 
  503. included into the program. In general the header file for data type xyz is 
  504. <LEDA/xyz.h>. Exceptions to this rule can be found in Tables 
  505. ref{Table Data Types} and ref{Table Algorithms}.
  506. section{Libraries}
  507. label{Libraries}
  508. The implementions of all LEDA data types and algorithms are precompiled and 
  509. contained in 4 libraries (libL.a, libG.a, libP.a, libWx.a) 
  510. which can be linked with CC application programs. In the following
  511. description it is assumed that these libraries are installed in one of the 
  512. systems default library directories (e.g. /usr/lib), which allows to use 
  513. the ``-ldots'' compiler option.
  514. a) {bf libL.a}\
  515. is the main LEDA library, it contains the implementations of all simple 
  516. data types (chapter ref{Simple Data Types}), basic data types 
  517. (chapter ref{Basic Data Types}), dictionaries and priority
  518. queues (chapter ref{Dictionaries and Related Types} and 
  519. ref{Priority Queues and Related Types}). A program 
  520. $prog.c$ using any of these data types has to be
  521. linked with the libL.a library like this:
  522. smallskip
  523. CC $prog.c$ -lL -lm
  524. smallskip
  525. b) {bf libG.a}\
  526. is the LEDA graph library. It contains the implementations of all graph 
  527. data types and algorithms (chapter ref{Graphs and Related Data Types}). 
  528. To compile a program using any graph 
  529. data type or algorithm the libG.a and libL.a library have to be used:
  530. smallskip
  531. CC $prog.c$ -lG -lL -lm
  532. smallskip
  533. c) {bf libP.a}\
  534. is the LEDA library for geometry in the plane. It contains the 
  535. implementations of all data types and algorithms for two-dimensional 
  536. geometry (chapter ref{Basic Data Types for Two-Dimensional Geometry}
  537. and ref{Advanced Data Types for Two-Dimensional Geometry}). 
  538. To compile a program using geometric data 
  539. types or algorithms the libP.a, libG.a, libL.a and maths libraries have 
  540. to be used:
  541. smallskip
  542. CC $prog.c$ -lP -lG -lL -lm 
  543. smallskip
  544. medskip
  545. d) {bf libWx.a}\
  546. is the LEDA library for graphic windows under the X11 
  547. window system. Application programs using data type $window$ 
  548. (cf. section ref{Panels}) have to be linked with this library:\
  549. CC $prog.c$ -lP -lG -lL -lWx -lX11 -lm\
  550. Note that the libraries must be given in the order -lP -lG -lL 
  551. and that the window library (-lWx) has to appear after the
  552. plane library (-lP).