src/work/alpar/matrix.cc
author alpar
Wed, 05 Jan 2005 12:26:59 +0000
changeset 1052 172ce6c3ac6e
permissions -rw-r--r--
Two examples showing a bit more convenient way to implement named parameters.
     1 #include <lemon/time_measure.h>
     2 #include <vector>
     3 
     4 template<class T>
     5 class Matrix 
     6 {
     7 public:
     8   int m,n;
     9   std::vector<T> values;
    10   
    11   Matrix(int _m, int _n) : m(_m), n(_n), values(n*m) {}
    12   typename std::vector<T>::reference operator()(int i, int j)
    13   { return values[i*n+j];}
    14 
    15   class Row 
    16   {
    17   public:
    18     Matrix<T> &mat;
    19     int row;
    20     
    21     Row(Matrix<T> &_mat,int _row) : mat(_mat), row(_row) {}
    22     typename std::vector<T>::reference operator()(int j)
    23     { return mat.values[row*mat.n+j];}
    24   };
    25   class Column 
    26   {
    27   public:
    28     Matrix<T> &mat;
    29     int col;
    30     
    31     Column(Matrix<T> &_mat,int _col) : mat(_mat), col(_col) {}
    32     typename std::vector<T>::reference operator[](int i)
    33     { return mat.values[i*mat.n+col];}
    34   };
    35   
    36   Row operator[](int i) { return Row(*this,i); }
    37   Column operator()(int j) { return Column(*this,j); }
    38 };
    39 
    40 main() 
    41 {
    42   const int COUNT=1000000;
    43   const int SIZE=100;
    44   
    45   Matrix<int> A(SIZE,SIZE);
    46   
    47   for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) A(i,j)=i+j;
    48 
    49   int s=0;
    50   lemon::Timer T;
    51   for(int c=0;c<COUNT;c++) {
    52     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A[i](j);
    53   }
    54   std::cout << "A[i](j): " << T << ' ' << s <<'\n';
    55   s=0;
    56   T.reset();
    57   for(int c=0;c<COUNT;c++) {
    58     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j);
    59   }
    60   std::cout << "A(i,j): " << T << ' ' << s << '\n';
    61   s=0;
    62   T.reset();
    63   for(int c=0;c<COUNT;c++) {
    64     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(j)[i];
    65   }
    66   std::cout << "A(j)[i]: " << T << ' ' << s << '\n';
    67   s=0;
    68   T.reset();
    69   for(int c=0;c<COUNT;c++) {
    70     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j);
    71   }
    72   std::cout << "A(j,i): " << T << ' ' << s << "\n\n";
    73 
    74   return 0;
    75 }