| [994] | 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 | } | 
|---|