На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Многомерный динамический массив
    ExpandedWrap disabled
      template<class T> inline void copy_line(T *In, const T *Out, size_t size) {
          for ( int i=0; i != size; i++ )
              *In++=*Out++;
      }
       
      template<class T>
      class   array2d
      {
          T       *body;
          int     x_size, y_size;
      public:
          array2d(): body(0), x_size(0), y_size(0) {}
       
          array2d(const int px_size,const int py_size): x_size(px_size), y_size(py_size) {
              body = new T[ px_size*py_size ];
          }
       
          ~array2d() {
              delete  [] body;
          }
        
          inline int get_x() const {return x_size;}
          inline int get_y() const {return y_size;}
       
          void    resize(const int px_size,const int py_size) {
              if ( body != 0 ) {
                  const int   old_size=x_size*y_size;
                  
                  T       *tmp = new T[ old_size ];
       
                  copy_line(tmp, body, old_size);
                  
                  delete [] body;
                  
                  body = new T[ px_size*py_size ];
                  
                  int         row_size;
                  
                  if ( x_size > px_size )
                      row_size = px_size;
                  else
                      row_size = x_size;
                  
                  if ( y_size > py_size ) y_size=py_size;
       
                  for ( int i=0; i != y_size; i++ )
                      copy_line(body+px_size*i, tmp+x_size*i, row_size);
                  
                  x_size = px_size;    
                  y_size = py_size;
       
                  delete [] tmp;
              }
              
              else {
                  x_size = px_size;    
                  y_size = py_size;
                  body = new T[ x_size*y_size*sizeof(T) ];
              }
          }
       
          inline T*       operator [] (const int& y) {
              return  &body[x_size*y];
          }
      };

    По прозьбе Fantasist'а предствляю на Ваш святой суд! Таким массивом можно пользоваться как встренным, зато в производительности выигрывает в разы!
      Молодец! Только непонятно зачем ты при изменении размера создаёшь буфер tmp, в который копируешь текущий массив body, потом удаляешь текуший массив body, потом создаёшь новый body и копируешь в него элементы из буфера tmp? Не проще ли было создать новый массив, с копировать в него данные из body, потом body удалить и присвоить ему новый массив?
      А совсем уже просто было бы воспользоваться функциями malloc, realloc и free.

      Цитата
      dimedrol, 27.04.04, 19:51
      Таким массивом можно пользоваться как встренным, зато в производительности выигрывает в разы!

      .. у бейсика!
        Цитата
        dimedrol
        Таким массивом можно пользоваться как встренным
        Вот и приведи примеры использования. Объясни хоть чуть чуть. Иначе я пока что не могу считать этот исходник для ФАКа законченным.
          Цитата
          Leprecon, 18.08.04, 15:56
          Вот и приведи примеры использования. Объясни хоть чуть чуть.

          Это ты у кого спросил? И о чём?
            Цитата
            Олег М, 18.08.04, 15:18
            Это ты у кого спросил? И о чём?
            О черт, ошибся с кнопкой цитаты :D Выделил текст у димидрола, а кнопку нажал твою :D
            К нему конечно обращался. Все.. поправил.
              Будет сделано
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0246 ]   [ 15 queries used ]   [ Generated: 30.04.24, 21:22 GMT ]