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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  array.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_ARRAY_H
  12. #define LEDA_ARRAY_H
  13. //------------------------------------------------------------------------------
  14. // array
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/impl/gen_array.h>
  17. /*{Manpage {array} {E} {One Dimensional Arrays} }*/
  18. template<class E> 
  19. class array : public gen_array {
  20. /*{Mdefinition
  21.     An instance $A$ of the parameterized data type name is a mapping from 
  22.     an interval $I =[a..b]$ of integers, the index set of $A$, to the set of 
  23.     variables of data type $E$, the element type of $A$. $A(i)$ is called the 
  24.     element at position $i$.  }*/
  25. int (*cmp_ptr)(const E&, const E&);   // user supplied cmp function
  26. // define virtual functions for element type E
  27. int cmp(GenPtr x, GenPtr y) const 
  28. { if (cmp_ptr == 0)
  29.      return LEDA_COMPARE(E,x,y);
  30.   else
  31.      return (*cmp_ptr)(LEDA_ACCESS(E,x),LEDA_ACCESS(E,y)); 
  32.  }
  33. int  int_type()                       const { return LEDA_INT_TYPE(E); }
  34. void print_el(GenPtr& x,ostream& out) const { LEDA_PRINT(E,x,out);}
  35. void read_el(GenPtr& x,istream& in)   const { LEDA_READ(E,x,in); }
  36. void clear_entry(GenPtr& x)           const { LEDA_CLEAR(E,x); }
  37. void copy_entry(GenPtr& x)            const { LEDA_COPY(E,x); }
  38. void init_entry(GenPtr& x)            const { LEDA_CREATE(E,x); }
  39. public:
  40. /*{Mcreation A}*/
  41. array(int a, int b) : gen_array(a,b) { init(); }
  42. /*{Mcreate  creates an instance var of type name with index set $[a..b]$. }*/
  43. array(int n) : gen_array(n)   { init(); }
  44. /*{Mcreate  creates an instance var of type name with index set $[0..n-1]$. }*/ 
  45. array()  {}
  46. /*{Mcreate  creates an instance var of type name with empty index set.}*/
  47. // copy constructor, destructor, operator=
  48.  array(const array<E>& A) : gen_array(A) {}
  49. ~array()  { clear(); }
  50.  array<E>& operator=(const array<E>& A) 
  51.  { gen_array::operator=(A); return *this; }
  52. /*{Moperations 1.2 5 }*/
  53. #if defined(LEDA_CHECKING_OFF)
  54. E  operator[](int x) const { return LEDA_ACCESS(E,v[x-Low]); }
  55. E& operator[](int x)       { return LEDA_ACCESS(E,v[x-Low]); }
  56. #else
  57. E  operator[](int x) const { return LEDA_ACCESS(E,inf(x)); }
  58. E& operator[](int x)       { return LEDA_ACCESS(E,entry(x)); }
  59. #endif
  60. /*{Marrop     returns $A(x)$.\
  61.                precond $ale xle b$.  }*/
  62. int low() const {return gen_array::low();}
  63. /*{Mop        returns the minimal index $a$. }*/
  64. int high() const {return gen_array::high();}
  65. /*{Mop        returns the maximal index $b$. }*/
  66. void sort(int (*cmp)(const E&, const E&)) 
  67. { cmp_ptr = cmp; gen_array::sort(low(),high()); }
  68. /*{Mopl       sorts the elements of var, using function $cmp$
  69.       to compare two elements, i.e., if $(in_a,dots,in_b)$
  70.       and $(out_a,dots,out_b)$ denote the values of the
  71.       variables $(A(a),dots,A(b))$ before and after the
  72.       call of sort, then $cmp(out_i,out_j) le 0$ for $ile j$
  73.       and there is a permutation $pi$ of $[a..b]$ such that
  74.       $out_i=in_{pi(i)}$ for $a le i le b$.}*/
  75. void sort() { cmp_ptr = 0; gen_array::sort(low(),high()); }
  76. /*{Mop       sorts the elements of var according to the linear order
  77.               of the element type $E$.\
  78.       precond A linear order on $E$
  79.               must have been defined by $compare(const E&, const E&)$. }*/
  80. void sort(int (*cmp)(const E&, const E&), int l, int h)
  81. { cmp_ptr = cmp; gen_array::sort(l,h); }
  82. /*{Mopl       sorts sub-array var$[l..h]$ using compare function $cmp$.}*/
  83. void sort(int l, int h) 
  84. { cmp_ptr = 0; gen_array::sort(l,h); }
  85. /*{Mop        sorts sub-array var$[l..h]$ using the linear order on $E$.}*/
  86. void permute() { gen_array::permute(); }
  87. /*{Mop        the elemens of var are randomly permuted.}*/
  88. void permute(int l, int h) { gen_array::permute(l,h); }
  89. /*{Mop        the elements of var$[l..h]$ are randomly permuted.}*/
  90. int binary_search(int (*cmp)(const E&,const E&), E x)
  91. { cmp_ptr = cmp; return gen_array::binary_search(Convert(x));}
  92. /*{Mopl      performs a binary search for $x$. Returns $i$
  93.       with $A[i] = x$ if $x$ in $A$, $A$.low$()-1$
  94.       otherwise. Function $cmp$ is used to compare
  95.       two elements.\
  96.       precond $A$ must be sorted
  97.       according to $cmp$.}*/
  98. int binary_search(E x)   
  99. { cmp_ptr = 0; return gen_array::binary_search(Convert(x)); }
  100. /*{Mop       performs a binary search for $x$ using the default
  101.               linear order on $E$.\
  102.       precond $A$ must be sorted.}*/
  103. void read(istream& I) {gen_array::read(I);}
  104. /*{Mop       reads $b-a+1$ objects of type $E$ from the
  105.       input stream $I$ into the array $A$ using the
  106.       overloaded $Read$ function (cf.~section ref{Overloading}).}*/
  107. void read() {gen_array::read();}
  108. /*{Mop       calls $A$.read($cin$) to read $A$ from the
  109.       standard input stream $cin$.}*/
  110. void read(string s) {gen_array::read(s);}
  111. /*{Mop        As above, uses string $s$ as prompt.}*/
  112. void print(ostream& O, char space = ' ') const { gen_array::print(O,space);}
  113. /*{Mopl      prints the contents of array $A$ to the output
  114.       stream $O$ using the overloaded $Print$ function
  115.       (cf.~section ref{Overloading}) to print each element. The
  116.       elements are separated by the character $space$.}*/
  117. void print(char space = ' ') const {gen_array::print(space);}
  118. /*{Mop       calls $A$.print($cout$, $space$) to print $A$ on 
  119.       the standard output stream $cout$.}*/
  120. void print(string s, char space = ' ') const {gen_array::print(s,space);}
  121. /*{Mopl        As above, uses string $s$ as header.}*/
  122. // Iteration
  123. GenPtr forall_loop_test(GenPtr it, E& x) const
  124. { if (it) x = LEDA_ACCESS(E,*(GenPtr*)it); 
  125.   return it;
  126.  }
  127. /*
  128. friend void Print(const array<E>& A, ostream& out) { A.print(out); }
  129. friend void Read(array<E>& A, istream& in)         { A.read(in); }
  130. */
  131. };
  132. /*{Mimplementation
  133. Arrays are implemented by CC vectors. The access operation takes time
  134. $O(1)$, the sorting is realized by quicksort (time $O(n log n)$) and
  135. the binary_search operation takes time $O(log n)$, where $n = b-a+1$.
  136. The space requirement is $O(|I|* sizeof(E))$.}*/
  137. #endif