Class vector

{ T *ms;

int size;

public:

vector() : size(0),ms(NULL) {}

~vector(){delete [] ms;}

void inkrem(const T &t) // увеличение размера массива на 1 элемент

{ T *tmp = ms;

ms=new T[size+1]; // ms − указатель на новый массив

if(tmp) memcpy(ms,tmp,sizeof(T)*size); // перезапись tmp -> ms

ms[size++]=t; // добавление нового элемента

if(tmp) delete [] tmp; // удаление временного массива

}

void decrem(void) // уменьшение размера массива на 1 элемент

{ T *tmp = ms;

if(size>1) ms=new T[--size];

if(tmp)

{ memcpy(ms,tmp,sizeof(T)*size); // перезапись без последнего

// элемента

delete [] tmp; // удаление временного массива

}

}

T &operator[](int ind) // определение обычного метода

{ // if(ind<0 || (ind>=size)) throw IndexOutOfRange; // возбуждение

// исключительной ситуации IndexOutOfRange

return ms[ind];

}

};

int main()

{ vector <int> VectInt;

vector <double> VectDouble;

VectInt. inkrem(3);

VectInt. inkrem(26);

VectInt. inkrem(12); // получен int-вектор из 3 атрибутов

VectDouble. inkrem(1.2);

VectDouble. inkrem(.26);//получен double-вектор из 2 атрибутов

int a=VectInt[1]; // a = ms[1]

cout << a << endl;

int b=VectInt[4]; // будет возбуждена исключительная ситуация

cout << b << endl; // но не обработана

double d=VectDouble[0];

cout << d << endl;

VectInt[0]=1;

VectDouble[1]=2.41;

return 0;

}

Класс vector наряду с конструктором и деструктором имеет 2 функции: increm – добавление в конец вектора нового элемента, dekrem – уменьшение числа элементов на единицу и операция [] обращения к i-му элементу вектора.

Параметр шаблона vector – любой тип, у которого определены операция присваивания и операция new. Например, при задании объекта типа vector <int> происходит генерация конкретного класса из шаблона и конструирование соответствующего объекта VectInt, при этом тип Т получает значение типа int. Генерация конкретного класса означает, что генерируются все его компоненты-функции, что может привести к существенному увеличению кода программы.

Выполнение функций

VectInt.increm(3);

VectInt.increm(26);

VectInt.increm(12);

приведет к созданию вектора (массива) из трех атрибутов (3, 26 и 12).

Сгенерировать конкретный класс из шаблона можно, явно записав:

template vector<int>;

При этом не будет создано никаких объектов типа vector<int>, но будет сгенерирован класс со всеми его компонентами.

В некоторых случаях желательно описания некоторых компонент-функций шаблона класса выполнить вне тела шаблона, например:

#include <iostream >

using namespace std;

template <class T1,class T2>

T1 sm1(T1 aa,T2 bb) // описание шаблона глобальной

{ return (T1)(aa+bb); // функции суммирования значений

} // двух аргументов

template <class T1,class T2>

Наши рекомендации