fork download
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. class WrappedMatrix
  5. {
  6. public:
  7. WrappedMatrix( int size ) : m_size(size)
  8. {
  9. m_data = new int*[size];
  10. for ( int i = 0; i < size; ++i )
  11. {
  12. m_data[i] = new int[size];
  13. }
  14. }
  15.  
  16. ~WrappedMatrix()
  17. {
  18. for ( int i = 0; i < m_size; ++i )
  19. {
  20. delete[] m_data[i];
  21. }
  22. delete[] m_data;
  23. }
  24.  
  25. inline int size() const { return m_size; }
  26.  
  27. int** raw() { return m_data; }
  28.  
  29. class Iterator
  30. {
  31. public:
  32. Iterator( WrappedMatrix& base, int x, int y ) : m_base(base), m_x(x), m_y(y)
  33. {
  34. }
  35.  
  36. int& operator*() { return m_base.raw()[m_x][m_y]; }
  37.  
  38. Iterator& operator++()
  39. {
  40. if((++m_x == m_base.size() ) && (++m_y != m_base.size()))
  41. m_x = 0;
  42.  
  43. return *this;
  44. }
  45.  
  46. bool operator==( const Iterator &rhs ) { return m_x == rhs.m_x && m_y == rhs.m_y; }
  47. bool operator!=( const Iterator &rhs ) { return m_x != rhs.m_x || m_y != rhs.m_y; }
  48.  
  49. public:
  50. WrappedMatrix& m_base;
  51. int m_x, m_y;
  52. };
  53.  
  54. Iterator begin() { return Iterator( *this, 0, 0 ); }
  55. Iterator end() { return Iterator( *this, m_size, m_size ); }
  56.  
  57.  
  58. private:
  59. int m_size;
  60. int** m_data;
  61. };
  62.  
  63. int f(int x)
  64. {
  65. return x * x;
  66. //return static_cast<int>( std::sin( static_cast<double>(x) / 1000.0 ) * 10000.0 );
  67. }
  68.  
  69. int main()
  70. {
  71. //int size = 10000;
  72. int size = 5000;
  73. WrappedMatrix w1( size ), w2( size );
  74.  
  75. // Initialise
  76. std::cout << "Filling array" << std::endl;
  77. for ( int x = 0; x < size; ++x )
  78. {
  79. for ( int y = 0; y < size; ++y )
  80. {
  81. w1.raw()[x][y] = x + y;
  82. }
  83. }
  84.  
  85.  
  86. std::cout << "Calculating first loop" << std::endl;
  87. //for ( int c = 0; c < 10; ++c )
  88. {
  89. if (1)
  90. {
  91. for ( int x = 0; x < size; ++x )
  92. {
  93. for ( int y = 0; y < size; ++y )
  94. {
  95. w2.raw()[x][y] = f(w1.raw()[x][y]);
  96. }
  97. }
  98. }
  99. else
  100. {
  101. WrappedMatrix::Iterator it1( w1.begin() ), it2( w2.begin() );
  102.  
  103. while ( it1 != w1.end() )
  104. {
  105. *it2 = f(*it1);
  106. //w2.raw()[it2.m_x][it2.m_y] = f(w1.raw()[it1.m_x][it1.m_y]);
  107. ++it1; ++it2;
  108. }
  109. }
  110. }
  111.  
  112.  
  113. return 0;
  114. }
  115.  
Success #stdin #stdout 0.25s 2812KB
stdin
Standard input is empty
stdout
Filling array
Calculating first loop