Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Способы создания динамических массивов

Поиск:
Автор: Fantasist

Что-то этот вопрос так часто задают, что я думаю пара поместить его туда.
Чтобы народ не писал такие ужастики как:

Код

float **Massiv;  
Massiv=new float*[height];  
for (int i=0;i<height;i++)  
  Massiv[i]=new float[width];  
.......  
.......  
for (int i=0;i<height;i++)  
   delete []Massiv[i];  
delete []Massiv;  


Итак, три способа создания динамических массивов:

1. Самодельный ручной.

Код

template <class _Tp>
class CDynArray
{
private:
 _Tp *buff;
 int m_x_size;
 int m_y_size;
public:
 CDynArray(): buff(0), m_x_size(0), m_y_size(0) {};
 CDynArray(const CDynArray<_Tp>& arr)
 {
     SetSize(arr.XSize(),arr.YSize());
     for(int i=0;i<m_x_size*m_y_size;++i)
       buff[i]=arr.buff[i];
 }
 ~CDynArray() {if (buff)  delete[] buff;};

 void SetSize(int x,int y)
 {
   if (buff) delete[] buff;
   if (x*y==0) buff=0;
   else
      buff=new _Tp[(m_x_size=x)*(m_y_size=y)];
 };

 _Tp& operator(int x,int y)
 {
   if (buff==0) throw "Not initialized";
   if ((x<0)||(x>=m_x_size)||(y<0)||(y>=m_y_size)) throw "Out of bounds";  
   return buff[x*m_y_size+x];
 };
 
 bool IsEmpty() {return buff==0;};
 int XSize() {return m_x_size;};
 int YSize() {return m_y_size;};
};

Кому не нравятся шаблоны, могут заменить все _Tp, на какой-нибудь float(или что там больше нравится), и выкинуть строчку с template.

2. C использованием уже готовых.

Код

template <class _Tp>
class CDynArray
{
private:
 CArray<_Tp,_Tp&> arr;
 int m_x_size;
 int m_y_size;
public:
 CDynArray(): m_x_size(0), m_y_size(0) {};
 CDynArray(const CDynArray<_Tp>& arr)
 {
    m_x_size=x; m_y_size=y;
    Copy(arr.arr);
 };
 ~CDynArray() {};

 void SetSize(int x,int y)  
 {
   arr.SetSize((m_x_size=x)*(m_y_size=y));
 };

 _Tp& operator(int x,int y)
 {
   return arr[x*m_y_size+y];
 };

 int XSize() {return m_x_size;};
 int YSize() {return m_y_size;};
};

Другую функциональность СArray можно добавить по вкусу.

P.S. Вообще-то, наверное, лучше использовать std::vector вместо СArray (хотя это тоже вопрос ситуации) но последний первым пришел мне на ум, как более известный начинающим(мне так кажется).

3. Разряженный массив.
(массив, имеющий большие, необязательно определенные, границы но в котором храниться достадочно малое количество элементов)

То есть этот массив оптимизирован на использование минимального количества памяти, по сравнению со скоростью доступа к элементам.
Можно, конечно, тоже самому написать целый класс, но удобнее(и скорее всего эффективнее) воспользоваться уже готовым ассоциативным массивом. Буду непоследователен, и вместо CMap использую std::map. Смысл от этого, впрочем, не меняется.

Код


template <class _Tp>
class CSparseArray
{
private:
 struct ArrIndex
 {
   int m_x,m_y;
   ArrIndex() {};
   ArrIndex(int x, int y): m_x(x), m_y(y) {};
   ArrIndex(const ArrIndex& ind): m_x(ind.m_x), m_y(ind.m_y) {};
   ArrIndex& operator=(const ArrIndex ind) {m_x=arr.m_x; m_y=ind.m_y; return *this;};
   bool operator<(const ArrIndex& arr) {return  m_x==ind.m_x ? m_y<ind.m_y : m_x<ind.m_x };
 };

std::map<ArrIndex,_Tp> arr;
public:
 _Tp& operator(int x,int y) {return arr[ArrIndex(x,y)];};
};

Такой массив, благодаря map, не нуждается в инициализации. Его можно использовать так:
Код

CSparseArray<int> marr;
marr(1,3)=5; //присвоим значение.
int i=marr(1,3); //i==5;
int j=marr(3,3); // marr(3,3)==0 , j==0


Думаю, фантазии у всех хватит чтобы из этого сделать трехмерный массив, дополнить нужный функционал, в общем, сделать то, что удовлетворит их потребностям.






Просмотров: 3076

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную