Страница 1 из 1

Класс для работы с большими данными

Добавлено: 27 янв 2011, 10:21
xapiton
Задали задание, написать класс который позволит работать с большими массивами, т.е. конструктор класса должен позволять создавать массив нужного (любого размера). Класс должен быть шаблонным. Должен уметь добавлять элементы в созданный массив. Получение доступа к элементам массива через индекс. Получение длины массива. Удаление текущего массива. И деструктор класса должен освобождать всю память.
Вот что у меня получилось :

Код: Выделить всё

template <typename Type> class CLargeData
{
private:
	Type* m_ptr;
	int m_size;
public:
	void Display()
	{
		for( int i = 0; i < m_size; i++ )
		{
			cout << m_ptr[ i ];
		}
		cout << endl;
	}
	Type* Pop( int pos )
	{
		Type* ptr = &m_ptr[ pos ];
		return ptr;
	}
	void Push( Type* var, int pos )
	{
		int i = 0;
		while( var[ i ] != NULL )
		{
			m_ptr[ pos ] = var[ i ];
			i++;
			pos++;
		}
	}
	CLargeData ( int size ) 
	{
		m_size = size;
		m_ptr = (Type*) VirtualAlloc( 0, m_size, MEM_COMMIT, PAGE_READWRITE );
		cout << "constr" << endl;
	}
	~CLargeData () 
	{
		VirtualFree( m_ptr, m_size, MEM_RELEASE );
		cout << "destr" << endl;

	}
};
А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.

.

Добавлено: 28 янв 2011, 11:36
BBB
xapiton писал(а):А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.
Нужно определить метод класса "оператор квадратные скобки". Так как, если я првильно понял, i-й элемент массива-класса - это i-й элемент массива m_ptr, то метод будет выглядеть так:

Код: Выделить всё

template <typename Type> class CLargeData
{
..............................
public:
..............................
   Type& operator [] (longint iiIndex)
     { return (m_ptr [iiIndex]); };
..............................
};

Re: Класс для работы с большими данными

Добавлено: 28 янв 2011, 11:55
BBB
Я когда-то, упражняясь, сделал темплей для массива, где можно было задавать произвольные границы диапазона. Т.е. не обязательно считать элементы с 0, как в C. А чтобы можно было как в Паскале, например, задать: array [3..5].

Вот что получилось:

Код: Выделить всё

template <class tType, longint iiLowBound, longint iiHighBound>
  class ArrayPas {
       protected:
          tType atArray [iiHighBound-iiLowBound+1];
       public:
          ArrayPas () {};
          ArrayPas (tType atInitArray[iiHighBound-iiLowBound+1])
              {
                longint ii;
                for (ii=0; ii<=(iiHighBound-iiLowBound); ii++)
                  atArray[ii]=atInitArray[ii];
              };
          ~ArrayPas () {};
          tType& operator [] (longint iiIndex)
            { return (atArray[iiIndex-iiLowBound]); }
    };   /* of "template-class ArrayPas" */